bgfx/3rdparty/glsl-optimizer/tests/fragment/bug-sampler-highpfull-inES3.txt
2015-07-28 20:04:55 -07:00

119 lines
4.4 KiB
Plaintext

#version 300 es
// There was a bug where due to xll_tex2Dlod sampling of a _CameraDepthTexture (that is a highp sampler)
// was producing a missing cast between half4 and float4 on Metal output.
// Shader is part of Unity's camera motion blur shader.
vec4 xll_tex2Dlod(sampler2D s, vec4 coord) { return textureLod( s, coord.xy, coord.w); }
struct v2f {
highp vec4 pos;
highp vec2 uv;
};
uniform highp vec3 _WorldSpaceCameraPos;
uniform highp vec4 _ProjectionParams;
uniform highp vec4 _ScreenParams;
uniform highp vec4 _ZBufferParams;
uniform highp vec4 _WorldSpaceLightPos0;
uniform highp mat4 _Object2World;
uniform highp mat4 _World2Object;
uniform highp float _MaxRadiusOrKInPaper;
const highp int SmallDiscKernelSamples = 12;
const highp vec2[12] SmallDiscKernel = vec2[12]( vec2( -0.326212, -0.40581), vec2( -0.840144, -0.07358), vec2( -0.695914, 0.457137), vec2( -0.203345, 0.620716), vec2( 0.96234, -0.194983), vec2( 0.473434, -0.480026), vec2( 0.519456, 0.767022), vec2( 0.185461, -0.893124), vec2( 0.507431, 0.064425), vec2( 0.89642, 0.412458), vec2( -0.32194, -0.932615), vec2( -0.791559, -0.59771));
uniform sampler2D _MainTex;
uniform highp sampler2D _CameraDepthTexture;
uniform sampler2D _VelTex;
uniform sampler2D _NeighbourMaxTex;
uniform sampler2D _NoiseTex;
uniform sampler2D _TileTexDebug;
uniform highp vec4 _MainTex_TexelSize;
uniform highp vec4 _CameraDepthTexture_TexelSize;
uniform highp vec4 _VelTex_TexelSize;
uniform highp mat4 _InvViewProj;
uniform highp mat4 _PrevViewProj;
uniform highp mat4 _ToPrevViewProjCombined;
uniform highp float _Jitter;
uniform highp float _VelocityScale;
uniform highp float _DisplayVelocityScale;
uniform highp float _MaxVelocity;
uniform highp float _MinVelocity;
uniform highp vec4 _BlurDirectionPacked;
uniform highp float _SoftZDistance;
highp float Linear01Depth( in highp float z )
{
return (1.0 / ((_ZBufferParams.x * z) + _ZBufferParams.y));
}
highp float cone( in highp vec2 px, in highp vec2 py, in highp vec2 v )
{
return clamp( (1.0 - (length((px - py)) / length(v))), 0.0, 1.0);
}
highp float cylinder( in highp vec2 x, in highp vec2 y, in highp vec2 v )
{
highp float lv = length(v);
return (1.0 - smoothstep( (0.95 * lv), (1.05 * lv), length((x - y))));
}
highp float softDepthCompare( in highp float za, in highp float zb )
{
return clamp( (1.0 - ((za - zb) / _SoftZDistance)), 0.0, 1.0);
}
highp vec4 ReconstructionDiscBlur( in v2f i )
{
highp vec2 xf = i.uv;
highp vec2 x = i.uv;
if ((_MainTex_TexelSize.y < 0.0))
{
xf.y = (1.0 - xf.y);
}
highp vec2 x2 = xf;
highp vec2 vn = xll_tex2Dlod(_NeighbourMaxTex, vec4(x2, 0.0, 0.0)).xy;
highp vec4 cx = xll_tex2Dlod(_MainTex, vec4(x, 0.0, 0.0));
highp vec2 vx = xll_tex2Dlod(_VelTex, vec4(xf, 0.0, 0.0)).xy;
highp vec4 noise = ((xll_tex2Dlod( _NoiseTex, (vec4(i.uv, 0.0, 0.0) * 11.0)) * 2.0) - 1.0);
highp float zx = xll_tex2Dlod(_CameraDepthTexture, vec4(x, 0.0, 0.0)).x;
zx = (-Linear01Depth( zx));
noise *= (_MainTex_TexelSize.xyxy * _Jitter);
highp float weight = 1.0;
highp vec4 sum = (cx * weight);
highp vec4 jitteredDir = (vn.xyxy + noise.xyyz);
jitteredDir = ((max( abs(jitteredDir.xyxy), ((_MainTex_TexelSize.xyxy * _MaxVelocity) * 0.15)) * sign(jitteredDir.xyxy)) * vec4( 1.0, 1.0, -1.0, -1.0));
highp int l = 0;
for ( ; (l < 12); (l++)) {
highp vec4 y = (i.uv.xyxy + ((jitteredDir.xyxy * SmallDiscKernel[l].xyxy) * vec4( 1.0, 1.0, -1.0, -1.0)));
highp vec4 yf = y;
if ((_MainTex_TexelSize.y < 0.0)){
yf.yw = (1.0 - yf.yw);
}
highp vec2 vy = xll_tex2Dlod( _VelTex, vec4( yf.xy, 0.0, 0.0)).xy;
highp float zy = xll_tex2Dlod( _CameraDepthTexture, vec4( y.xy, 0.0, 0.0)).x;
zy = (-Linear01Depth( zy));
highp float f = softDepthCompare( zx, zy);
highp float b = softDepthCompare( zy, zx);
highp float alphay = (((b * cone( x, y.xy, vx)) + (f * cone( y.xy, x, vy))) + ((cylinder( y.xy, x, vy) * cylinder( x, y.xy, vx)) * 2.0));
highp vec4 cy = xll_tex2Dlod( _MainTex, vec4( y.xy, 0.0, 0.0));
sum += (cy * alphay);
weight += alphay;
}
return (sum / weight);
}
in highp vec2 xlv_TEXCOORD0;
out mediump vec4 _fragData;
void main() {
highp vec4 xl_retval;
v2f xlt_i;
xlt_i.pos = vec4(0.0);
xlt_i.uv = vec2(xlv_TEXCOORD0);
xl_retval = ReconstructionDiscBlur(xlt_i);
_fragData = vec4(xl_retval);
}