bgfx/examples/39-assao/cs_assao_prepare_depths_half.sc
2018-12-14 22:09:37 +01:00

49 lines
1.5 KiB
Scala

/*
* Copyright 2018 Attila Kocsis. All rights reserved.
* License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "bgfx_compute.sh"
#include "uniforms.sh"
SAMPLER2D(s_depthSource, 0);
IMAGE2D_WR(s_target0, r16f, 1);
IMAGE2D_WR(s_target1, r16f, 2);
float ScreenSpaceToViewSpaceDepth( float screenDepth )
{
float depthLinearizeMul = u_depthUnpackConsts.x;
float depthLinearizeAdd = u_depthUnpackConsts.y;
// Optimised version of "-cameraClipNear / (cameraClipFar - projDepth * (cameraClipFar - cameraClipNear)) * cameraClipFar"
// Set your depthLinearizeMul and depthLinearizeAdd to:
// depthLinearizeMul = ( cameraClipFar * cameraClipNear) / ( cameraClipFar - cameraClipNear );
// depthLinearizeAdd = cameraClipFar / ( cameraClipFar - cameraClipNear );
return depthLinearizeMul / ( depthLinearizeAdd - screenDepth );
}
NUM_THREADS(8, 8, 1)
void main()
{
uvec2 dtID = uvec2(gl_GlobalInvocationID.xy);
uvec2 dim = imageSize(s_target0).xy;
if (all(lessThan(dtID.xy, dim) ) )
{
ivec2 baseCoord = ivec2(dtID.xy) * 2;
#if BGFX_SHADER_LANGUAGE_GLSL
float a = texelFetch(s_depthSource, baseCoord + ivec2( 0, 1 ), 0).x;
float d = texelFetch(s_depthSource, baseCoord + ivec2( 1, 0 ), 0).x;
#else
float a = texelFetch(s_depthSource, baseCoord + ivec2( 0, 0 ), 0).x;
float d = texelFetch(s_depthSource, baseCoord + ivec2( 1, 1 ), 0).x;
#endif
imageStore(s_target0, ivec2(dtID.xy), ScreenSpaceToViewSpaceDepth( a ).xxxx);
imageStore(s_target1, ivec2(dtID.xy), ScreenSpaceToViewSpaceDepth( d ).xxxx);
}
}