void IEffect::UseCustomTexture(Texture* texture) { Uniform CustomTexture; std::ostringstream toSTR; toSTR << "uTex" << TextureUnits; CustomTexture.Name = toSTR.str(); CustomTexture.Type = DataType::Int; CustomTexture.Usage = PostEffects::Other; CustomTexture.SetValue(&TextureUnits); AddUniform(CustomTexture); // Set RTT Order RTTOrder.push_back(RTT::Info(texture, RTT::CustomTexture, TextureUnits)); TextureUnits++; }
void IEffect::UseLastRTT() { Uniform RTT; std::ostringstream toSTR; toSTR << "uTex" << TextureUnits; RTT.Name = toSTR.str(); RTT.Type = DataType::Int; RTT.Usage = PostEffects::Other; RTT.SetValue(&TextureUnits); AddUniform(RTT); // Set RTT Order RTTOrder.push_back(RTT::Info(RTT::LastRTT, TextureUnits)); TextureUnits++; }
void IEffect::UseColor() { Uniform Color; std::ostringstream toSTR; toSTR << "uTex" << TextureUnits; Color.Name = toSTR.str(); Color.Type = DataType::Int; Color.Usage = PostEffects::Other; Color.SetValue(&TextureUnits); AddUniform(Color); // Set RTT Order RTTOrder.push_back(RTT::Info(RTT::Color, TextureUnits)); TextureUnits++; }
void IEffect::UseDepth() { Uniform Depth; std::ostringstream toSTR; toSTR << "uTex" << TextureUnits; Depth.Name = toSTR.str(); Depth.Type = DataType::Int; Depth.Usage = PostEffects::Other; Depth.SetValue(&TextureUnits); AddUniform(Depth); // Set RTT Order RTTOrder.push_back(RTT::Info(RTT::Depth, TextureUnits)); TextureUnits++; }
DepthOfFieldEffect::DepthOfFieldEffect(Texture* texture1, Texture* texture2, const uint32 Width, const uint32 Height) : IEffect(Width, Height) { // Set RTT UseCustomTexture(texture1); UseCustomTexture(texture2); UseRTT(RTT::Color); UseRTT(RTT::Depth); // Create Fragment Shader FragmentShaderString = "float DecodeNativeDepth(float native_z, vec4 z_info_local)\n" "{\n" "return z_info_local.z / (native_z * z_info_local.w + z_info_local.y);\n" "}\n" "uniform sampler2D uTex0, uTex1, uTex2, uTex3;\n" "uniform float uFocalPosition, uFocalRange, uRatioL, uRatioH;\n" "uniform vec2 uNearFar;\n" "varying vec2 vTexcoord;\n" "void main() {\n" "float ratioL = uRatioL;\n" "float ratioH = uRatioH;\n" "float focalPosition = uFocalPosition;\n" "float focalRange = uFocalRange;\n" "vec4 z_info_local = vec4(uNearFar.x,uNearFar.y,uNearFar.x*uNearFar.y,uNearFar.x-uNearFar.y);\n" "float depth = texture2D(uTex3, vTexcoord).x;\n" "float linearDepth = DecodeNativeDepth(depth, z_info_local);\n" "float ratio = clamp(abs(focalPosition-linearDepth)-focalRange, 0.0, ratioL);\n" "if (ratio < 0.4) gl_FragColor = mix(texture2D(uTex2, vTexcoord), texture2D(uTex1, vTexcoord), ratio / (ratioL - ratioH));\n" "else gl_FragColor = mix(texture2D(uTex1, vTexcoord), texture2D(uTex0, vTexcoord), (ratio-ratioH) / (ratioL - ratioH));\n" "}"; CompileShaders(); Uniform nearFarPlane; nearFarPlane.Name = "uNearFar"; nearFarPlane.Type = DataType::Vec2; nearFarPlane.Usage = PostEffects::NearFarPlane; AddUniform(nearFarPlane); f32 fPosition = 20.f; f32 fRange = 2.f; f32 rL = 3.1f; f32 rH = 1.0f; Uniform focalPosition; Uniform focalRange; Uniform ratioL; Uniform ratioH; focalPosition.Name = "uFocalPosition"; focalPosition.Type = DataType::Float; focalPosition.Usage = PostEffects::Other; focalPosition.SetValue(&fPosition); focalRange.Name = "uFocalRange"; focalRange.Type = DataType::Float; focalRange.Usage = PostEffects::Other; focalRange.SetValue(&fRange); ratioL.Name = "uRatioL"; ratioL.Type = DataType::Float; ratioL.Usage = PostEffects::Other; ratioL.SetValue(&rL); ratioH.Name = "uRatioH"; ratioH.Type = DataType::Float; ratioH.Usage = PostEffects::Other; ratioH.SetValue(&rH); AddUniform(focalPosition); AddUniform(focalRange); AddUniform(ratioL); AddUniform(ratioH); }