Fix the skybox visual artifact bug #10
This commit is contained in:
parent
73692b710e
commit
2a255affe4
2 changed files with 12 additions and 2 deletions
|
|
@ -9,15 +9,19 @@ uniform sampler2D equirect;
|
||||||
const vec2 inv_atan = vec2(0.15915494309, 0.31830988618);
|
const vec2 inv_atan = vec2(0.15915494309, 0.31830988618);
|
||||||
|
|
||||||
vec2 sample_spherical_map(vec3 v) {
|
vec2 sample_spherical_map(vec3 v) {
|
||||||
vec2 uv = vec2(atan(v.z, v.x), asin(v.y));
|
vec2 uv = vec2(atan(v.z, v.x), asin(clamp(v.y, -1.0, 1.0)));
|
||||||
uv *= inv_atan;
|
uv *= inv_atan;
|
||||||
uv += 0.5;
|
uv += 0.5;
|
||||||
|
uv.x = fract(uv.x);
|
||||||
return uv;
|
return uv;
|
||||||
}
|
}
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
vec2 uv = sample_spherical_map(normalize(direction));
|
vec2 uv = sample_spherical_map(normalize(direction));
|
||||||
uv.y = 1.0 - uv.y;
|
uv.y = 1.0 - uv.y;
|
||||||
|
vec2 size = vec2(textureSize(equirect, 0));
|
||||||
|
float epsY = 0.5 / max(size.y, 1.0);
|
||||||
|
uv.y = clamp(uv.y, epsY, 1.0 - epsY);
|
||||||
vec3 color = texture(equirect, uv).rgb;
|
vec3 color = texture(equirect, uv).rgb;
|
||||||
frag_color = vec4(color, 1.0);
|
frag_color = vec4(color, 1.0);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ use glium::glutin::surface::WindowSurface;
|
||||||
use glium::index::PrimitiveType;
|
use glium::index::PrimitiveType;
|
||||||
use glium::texture::{RawImage2d, SrgbTexture2d, Texture2d};
|
use glium::texture::{RawImage2d, SrgbTexture2d, Texture2d};
|
||||||
use glium::uniform;
|
use glium::uniform;
|
||||||
|
use glium::uniforms::{MagnifySamplerFilter, MinifySamplerFilter, SamplerWrapFunction};
|
||||||
use glam::{Mat4, Vec2, Vec3};
|
use glam::{Mat4, Vec2, Vec3};
|
||||||
use winit::event_loop::EventLoop;
|
use winit::event_loop::EventLoop;
|
||||||
use raidillon_assets::include_shader;
|
use raidillon_assets::include_shader;
|
||||||
|
|
@ -132,10 +133,15 @@ impl RenderingSystem for SkyboxRenderingSystem {
|
||||||
let mut view = cam.view();
|
let mut view = cam.view();
|
||||||
// remove translation from view matrix (only orientation)
|
// remove translation from view matrix (only orientation)
|
||||||
view.col_mut(3).x = 0.0; view.col_mut(3).y = 0.0; view.col_mut(3).z = 0.0;
|
view.col_mut(3).x = 0.0; view.col_mut(3).y = 0.0; view.col_mut(3).z = 0.0;
|
||||||
|
let mut sampler = self.equirect_srgb.sampled();
|
||||||
|
sampler = sampler.wrap_function(SamplerWrapFunction::Repeat);
|
||||||
|
sampler = sampler.minify_filter(MinifySamplerFilter::Linear);
|
||||||
|
sampler = sampler.magnify_filter(MagnifySamplerFilter::Linear);
|
||||||
|
|
||||||
let uniforms = uniform! {
|
let uniforms = uniform! {
|
||||||
view: view.to_cols_array_2d(),
|
view: view.to_cols_array_2d(),
|
||||||
projection: cam.projection().to_cols_array_2d(),
|
projection: cam.projection().to_cols_array_2d(),
|
||||||
equirect: &self.equirect_srgb,
|
equirect: sampler,
|
||||||
};
|
};
|
||||||
let params = glium::DrawParameters { depth: glium::Depth { test: glium::draw_parameters::DepthTest::IfLessOrEqual, write: false, ..Default::default() }, ..Default::default() };
|
let params = glium::DrawParameters { depth: glium::Depth { test: glium::draw_parameters::DepthTest::IfLessOrEqual, write: false, ..Default::default() }, ..Default::default() };
|
||||||
ctx.target.draw(&self.quad_vb, &self.quad_ib, &self.program, &uniforms, ¶ms).ok();
|
ctx.target.draw(&self.quad_vb, &self.quad_ib, &self.program, &uniforms, ¶ms).ok();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue