diff options
Diffstat (limited to 'tests/auto/qshaderbaker/data/hlsl_cbuf_error.frag')
-rw-r--r-- | tests/auto/qshaderbaker/data/hlsl_cbuf_error.frag | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/tests/auto/qshaderbaker/data/hlsl_cbuf_error.frag b/tests/auto/qshaderbaker/data/hlsl_cbuf_error.frag new file mode 100644 index 0000000..ba59ffa --- /dev/null +++ b/tests/auto/qshaderbaker/data/hlsl_cbuf_error.frag @@ -0,0 +1,47 @@ +#version 440 + +layout(location = 0) in vec3 vECVertNormal; +layout(location = 1) in vec3 vECVertPos; +layout(location = 2) flat in vec3 vDiffuseAdjust; + +#define MAX_LIGHTS 10 + +struct Light { + vec3 ECLightPosition; + vec3 attenuation; + vec3 color; + float intensity; + float specularExp; + // this is not translatable to HLSL +}; + +layout(std140, binding = 1) uniform buf { + vec3 ECCameraPosition; + vec3 ka; + vec3 kd; + vec3 ks; + Light lights[MAX_LIGHTS]; + int numLights; + layout(row_major) mat3 mm; +} ubuf; + +layout(location = 0) out vec4 fragColor; + +void main() +{ + vec3 unnormL = ubuf.lights[0].ECLightPosition - vECVertPos; + float dist = length(unnormL); + float att = 1.0 / (ubuf.lights[0].attenuation.x + ubuf.lights[0].attenuation.y * dist + ubuf.lights[0].attenuation.z * dist * dist); + + vec3 N = normalize(vECVertNormal); + vec3 L = normalize(unnormL); + float NL = max(0.0, dot(N, L)); + vec3 dColor = att * ubuf.lights[0].intensity * ubuf.lights[0].color * NL; + + vec3 R = reflect(-L, N); + vec3 V = normalize(ubuf.ECCameraPosition - vECVertPos); + float RV = max(0.0, dot(R, V)); + vec3 sColor = att * ubuf.lights[0].intensity * ubuf.lights[0].color * pow(RV, ubuf.lights[0].specularExp); + + fragColor = vec4(ubuf.ka + (ubuf.kd + vDiffuseAdjust) * dColor + ubuf.ks * sColor, 1.0); +} |