diff options
Diffstat (limited to '3rdparty/bgfx/examples/31-rsm/vs_rsm_lbuffer.sc')
-rw-r--r-- | 3rdparty/bgfx/examples/31-rsm/vs_rsm_lbuffer.sc | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/3rdparty/bgfx/examples/31-rsm/vs_rsm_lbuffer.sc b/3rdparty/bgfx/examples/31-rsm/vs_rsm_lbuffer.sc new file mode 100644 index 00000000000..357b38ec387 --- /dev/null +++ b/3rdparty/bgfx/examples/31-rsm/vs_rsm_lbuffer.sc @@ -0,0 +1,60 @@ +$input a_position +$output v_lightCenterScale, v_color0 + +/* + * Copyright 2016 Joseph Cherlin. All rights reserved. + * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause + */ + +#include "../common/common.sh" + +uniform vec4 u_sphereInfo; +uniform mat4 u_invMvpShadow; + + +// Note texture binding starts at slot 2. Problem is that vert textures and frag textures are different. +SAMPLER2D(s_shadowMap, 2); // Used to reconstruct 3d position for lights +SAMPLER2D(s_rsm, 3); // Reflective shadow map, used to scale/color light + +float toClipSpaceDepth(float _depthTextureZ) +{ +#if BGFX_SHADER_LANGUAGE_HLSL || BGFX_SHADER_LANGUAGE_METAL + return _depthTextureZ; +#else + return _depthTextureZ * 2.0 - 1.0; +#endif // BGFX_SHADER_LANGUAGE_HLSL || BGFX_SHADER_LANGUAGE_METAL +} + +vec3 clipToWorld(mat4 _invViewProj, vec3 _clipPos) +{ + vec4 wpos = mul(_invViewProj, vec4(_clipPos, 1.0) ); + return wpos.xyz / wpos.w; +} + +void main() +{ + // Calculate vertex position + vec3 objectSpacePos = a_position; + vec2 texCoord = u_sphereInfo.xy; + + // Get world position using the shadow map + float deviceDepth = texture2DLod(s_shadowMap, texCoord, 0).x; + float depth = toClipSpaceDepth(deviceDepth); + vec3 clip = vec3(texCoord * 2.0 - 1.0, depth); +#if BGFX_SHADER_LANGUAGE_HLSL || BGFX_SHADER_LANGUAGE_METAL + clip.y = -clip.y; +#endif // BGFX_SHADER_LANGUAGE_HLSL || BGFX_SHADER_LANGUAGE_METAL + vec3 wPos = clipToWorld(u_invMvpShadow, clip); + wPos.y -= 0.001; // Would be much better to perturb in normal direction, but I didn't do that. + + // Scale and color are already in the rsm + vec4 rsm = texture2DLod(s_rsm, texCoord, 0).xyzw; + float radScale = u_sphereInfo.z; + float rad = rsm.w * radScale; + + gl_Position = mul(u_viewProj, vec4(wPos+objectSpacePos*rad, 1.0) ); + + v_lightCenterScale.xyz = wPos.xyz; + v_lightCenterScale.w = rad; + v_color0.xyz = rsm.xyz; +} |