Browse Source

Merge pull request #659 from lunkhound/d3d-proj-fix

removed z coord adjustment in shadow2D() shader builtin for HLSL
Branimir Karadžić 10 years ago
parent
commit
c47216a32c

+ 5 - 1
examples/15-shadowmaps-simple/fs_sms_shadow_pd.sc

@@ -7,8 +7,12 @@ $input v_position
 
 #include "../common/common.sh"
 
+uniform vec4 u_depthScaleOffset;  // for GL, map depth values into [0, 1] range
+#define u_depthScale u_depthScaleOffset.x
+#define u_depthOffset u_depthScaleOffset.y
+
 void main()
 {
-	float depth = v_position.z/v_position.w * 0.5 + 0.5;
+	float depth = v_position.z/v_position.w * u_depthScale + u_depthOffset;
 	gl_FragColor = packFloatToRgba(depth);
 }

+ 9 - 2
examples/15-shadowmaps-simple/shadowmaps_simple.cpp

@@ -91,6 +91,13 @@ int _main_(int _argc, char** _argv)
 	bgfx::UniformHandle u_shadowMap = bgfx::createUniform("u_shadowMap", bgfx::UniformType::Int1);
 	bgfx::UniformHandle u_lightPos  = bgfx::createUniform("u_lightPos",  bgfx::UniformType::Vec4);
 	bgfx::UniformHandle u_lightMtx  = bgfx::createUniform("u_lightMtx",  bgfx::UniformType::Mat4);
+	// When using GL clip space depth range [-1, 1] and packing depth into color buffer, we need to
+	// adjust the depth range to be [0, 1] for writing to the color buffer
+	bgfx::UniformHandle u_depthScaleOffset = bgfx::createUniform("u_depthScaleOffset",  bgfx::UniformType::Vec4);
+	const float depthScale = flipV ? 0.5f : 1.0f;
+	const float depthOffset = flipV ? 0.5f : 0.0f;
+	float depthScaleOffset[4] = {depthScale, depthOffset, 0.0f, 0.0f};
+	bgfx::setUniform(u_depthScaleOffset, depthScaleOffset);
 
 	// Vertex declarations.
 	bgfx::VertexDecl PosNormalDecl;
@@ -303,8 +310,8 @@ int _main_(int _argc, char** _argv)
 		{
 			0.5f, 0.0f, 0.0f, 0.0f,
 			0.0f,   sy, 0.0f, 0.0f,
-			0.0f, 0.0f, 0.5f, 0.0f,
-			0.5f, 0.5f, 0.5f, 1.0f,
+			0.0f, 0.0f, depthScale, 0.0f,
+			0.5f, 0.5f, depthOffset, 1.0f,
 		};
 
 		float mtxTmp[16];

BIN
examples/runtime/shaders/dx11/fs_sms_mesh.bin


BIN
examples/runtime/shaders/dx11/fs_sms_shadow_pd.bin


BIN
examples/runtime/shaders/dx9/fs_sms_mesh.bin


BIN
examples/runtime/shaders/dx9/fs_sms_shadow_pd.bin


BIN
examples/runtime/shaders/gles/fs_sms_shadow_pd.bin


BIN
examples/runtime/shaders/glsl/fs_sms_shadow_pd.bin


BIN
examples/runtime/shaders/metal/fs_sms_shadow_pd.bin


+ 5 - 5
src/bgfx_shader.sh

@@ -75,13 +75,13 @@ struct BgfxSampler2DShadow
 
 float bgfxShadow2D(BgfxSampler2DShadow _sampler, vec3 _coord)
 {
-	return _sampler.m_texture.SampleCmpLevelZero(_sampler.m_sampler, _coord.xy, _coord.z * 2.0 - 1.0);
+	return _sampler.m_texture.SampleCmpLevelZero(_sampler.m_sampler, _coord.xy, _coord.z);
 }
 
 float bgfxShadow2DProj(BgfxSampler2DShadow _sampler, vec4 _coord)
 {
 	vec3 coord = _coord.xyz * rcp(_coord.w);
-	return _sampler.m_texture.SampleCmpLevelZero(_sampler.m_sampler, coord.xy, coord.z * 2.0 - 1.0);
+	return _sampler.m_texture.SampleCmpLevelZero(_sampler.m_sampler, coord.xy, coord.z);
 }
 
 struct BgfxSampler3D
@@ -196,9 +196,9 @@ float bgfxShadow2D(sampler2DShadow _sampler, vec3 _coord)
 {
 #if 0
 	float occluder = tex2D(_sampler, _coord.xy).x;
-	return step(_coord.z * 2.0 - 1.0, occluder);
+	return step(_coord.z, occluder);
 #else
-	return tex2Dproj(_sampler, vec4(_coord.xy, _coord.z * 2.0 - 1.0, 1.0) ).x;
+	return tex2Dproj(_sampler, vec4(_coord.xy, _coord.z, 1.0) ).x;
 #endif // 0
 }
 
@@ -207,7 +207,7 @@ float bgfxShadow2DProj(sampler2DShadow _sampler, vec4 _coord)
 #if 0
 	vec3 coord = _coord.xyz * rcp(_coord.w);
 	float occluder = tex2D(_sampler, coord.xy).x;
-	return step(coord.z * 2.0 - 1.0, occluder);
+	return step(coord.z, occluder);
 #else
 	return tex2Dproj(_sampler, _coord).x;
 #endif // 0