Exemple #1
0
 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++;
 }
Exemple #2
0
 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++;
 }
Exemple #3
0
 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++;
 }
Exemple #4
0
 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++;
 }
Exemple #5
0
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);
}