mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Split terrain rendering to avoid redrawing skybox
This commit is contained in:
parent
bca3817163
commit
28e625635f
@ -146,7 +146,8 @@ vec2 cloud_at(vec3 pos) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
vec4 get_cloud_color(vec3 dir, vec3 origin, float time_of_day, float max_dist, float quality) {
|
vec4 get_cloud_color(vec3 dir, vec3 origin, float time_of_day, float max_dist, float quality) {
|
||||||
const float INCR = 0.07;
|
|
||||||
|
const float INCR = 0.06;
|
||||||
|
|
||||||
float mind = (CLOUD_HEIGHT_MIN - origin.z) / dir.z;
|
float mind = (CLOUD_HEIGHT_MIN - origin.z) / dir.z;
|
||||||
float maxd = (CLOUD_HEIGHT_MAX - origin.z) / dir.z;
|
float maxd = (CLOUD_HEIGHT_MAX - origin.z) / dir.z;
|
||||||
|
@ -18,5 +18,5 @@ void main() {
|
|||||||
gl_Position =
|
gl_Position =
|
||||||
proj_mat *
|
proj_mat *
|
||||||
view_mat *
|
view_mat *
|
||||||
vec4(v_pos * 2000.0 + cam_pos.xyz, 1);
|
vec4(v_pos * 3000.0 + cam_pos.xyz, 1);
|
||||||
}
|
}
|
||||||
|
@ -31,7 +31,7 @@ gfx_defines! {
|
|||||||
noise: gfx::TextureSampler<f32> = "t_noise",
|
noise: gfx::TextureSampler<f32> = "t_noise",
|
||||||
|
|
||||||
tgt_color: gfx::RenderTarget<TgtColorFmt> = "tgt_color",
|
tgt_color: gfx::RenderTarget<TgtColorFmt> = "tgt_color",
|
||||||
tgt_depth: gfx::DepthTarget<TgtDepthFmt> = gfx::preset::depth::PASS_TEST,
|
tgt_depth: gfx::DepthTarget<TgtDepthFmt> = gfx::preset::depth::LESS_EQUAL_WRITE,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -293,9 +293,6 @@ impl Scene {
|
|||||||
|
|
||||||
/// Render the scene using the provided `Renderer`.
|
/// Render the scene using the provided `Renderer`.
|
||||||
pub fn render(&mut self, renderer: &mut Renderer, client: &mut Client) {
|
pub fn render(&mut self, renderer: &mut Renderer, client: &mut Client) {
|
||||||
// Render the skybox.
|
|
||||||
renderer.render_skybox(&self.skybox.model, &self.globals, &self.skybox.locals);
|
|
||||||
|
|
||||||
// Render terrain and figures.
|
// Render terrain and figures.
|
||||||
self.figure_mgr.render(
|
self.figure_mgr.render(
|
||||||
renderer,
|
renderer,
|
||||||
@ -313,6 +310,17 @@ impl Scene {
|
|||||||
self.camera.get_focus_pos(),
|
self.camera.get_focus_pos(),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Render the skybox.
|
||||||
|
renderer.render_skybox(&self.skybox.model, &self.globals, &self.skybox.locals);
|
||||||
|
|
||||||
|
self.terrain.render_translucent(
|
||||||
|
renderer,
|
||||||
|
&self.globals,
|
||||||
|
&self.lights,
|
||||||
|
&self.shadows,
|
||||||
|
self.camera.get_focus_pos(),
|
||||||
|
);
|
||||||
|
|
||||||
renderer.render_post_process(
|
renderer.render_post_process(
|
||||||
&self.postprocess.model,
|
&self.postprocess.model,
|
||||||
&self.globals,
|
&self.globals,
|
||||||
|
@ -1092,6 +1092,32 @@ impl<V: RectRasterableVol> Terrain<V> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn render_translucent(
|
||||||
|
&self,
|
||||||
|
renderer: &mut Renderer,
|
||||||
|
globals: &Consts<Globals>,
|
||||||
|
lights: &Consts<Light>,
|
||||||
|
shadows: &Consts<Shadow>,
|
||||||
|
focus_pos: Vec3<f32>,
|
||||||
|
) {
|
||||||
|
let focus_chunk = Vec2::from(focus_pos).map2(TerrainChunk::RECT_SIZE, |e: f32, sz| {
|
||||||
|
(e as i32).div_euclid(sz as i32)
|
||||||
|
});
|
||||||
|
|
||||||
|
let chunks = &self.chunks;
|
||||||
|
let chunk_iter = Spiral2d::new()
|
||||||
|
.scan(0, |n, rpos| {
|
||||||
|
if *n >= chunks.len() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
*n += 1;
|
||||||
|
let pos = focus_chunk + rpos;
|
||||||
|
Some(chunks.get(&pos).map(|c| (pos, c)))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.filter_map(|x| x);
|
||||||
|
|
||||||
// Terrain sprites
|
// Terrain sprites
|
||||||
for (pos, chunk) in chunk_iter.clone() {
|
for (pos, chunk) in chunk_iter.clone() {
|
||||||
|
Loading…
Reference in New Issue
Block a user