three_d/renderer/effect/
full_screen.rsuse crate::renderer::*;
#[derive(Clone, Debug, Default)]
pub struct ScreenEffect {
pub write_mask: WriteMask,
pub blend: Blend,
}
impl Effect for ScreenEffect {
fn fragment_shader_source(
&self,
_lights: &[&dyn crate::Light],
color_texture: Option<ColorTexture>,
depth_texture: Option<DepthTexture>,
) -> String {
format!(
"{}{}{}{}
in vec2 uvs;
layout (location = 0) out vec4 outColor;
void main()
{{
{}
{}
}}
",
color_texture
.map(|t| t.fragment_shader_source())
.unwrap_or("".to_string()),
depth_texture
.map(|t| t.fragment_shader_source())
.unwrap_or("".to_string()),
ToneMapping::fragment_shader_source(),
ColorMapping::fragment_shader_source(),
color_texture
.map(|_| "
outColor = sample_color(uvs);
outColor.rgb = tone_mapping(outColor.rgb);
outColor.rgb = color_mapping(outColor.rgb);"
.to_string())
.unwrap_or("".to_string()),
depth_texture
.map(|_| "gl_FragDepth = sample_depth(uvs);".to_string())
.unwrap_or("".to_string()),
)
}
fn id(
&self,
color_texture: Option<ColorTexture>,
depth_texture: Option<DepthTexture>,
) -> EffectMaterialId {
EffectMaterialId::ScreenEffect(color_texture, depth_texture)
}
fn use_uniforms(
&self,
program: &Program,
viewer: &dyn Viewer,
_lights: &[&dyn crate::Light],
color_texture: Option<ColorTexture>,
depth_texture: Option<DepthTexture>,
) {
if let Some(color_texture) = color_texture {
viewer.tone_mapping().use_uniforms(program);
viewer.color_mapping().use_uniforms(program);
color_texture.use_uniforms(program);
}
if let Some(depth_texture) = depth_texture {
depth_texture.use_uniforms(program);
}
}
fn render_states(&self) -> RenderStates {
RenderStates {
depth_test: DepthTest::Always,
cull: Cull::Back,
write_mask: self.write_mask,
blend: self.blend,
}
}
}