| SKIP: FAILED |
| |
| benchmark/skinned-shadowed-pbr-fragment.wgsl:51:13 warning: use of deprecated language feature: the @stride attribute is deprecated; use a larger type if necessary |
| lights : @stride(32) array<Light>; |
| ^^^^^^ |
| |
| #version 310 es |
| precision mediump float; |
| |
| const float GAMMA = 2.200000048f; |
| |
| vec3 linearTosRGB(vec3 linear) { |
| float INV_GAMMA = (1.0f / GAMMA); |
| return pow(linear, vec3(INV_GAMMA)); |
| } |
| |
| struct Camera { |
| mat4 projection; |
| mat4 inverseProjection; |
| mat4 view; |
| vec3 position; |
| float time; |
| vec2 outputSize; |
| float zNear; |
| float zFar; |
| }; |
| |
| layout(binding = 0) uniform Camera_1 { |
| mat4 projection; |
| mat4 inverseProjection; |
| mat4 view; |
| vec3 position; |
| float time; |
| vec2 outputSize; |
| float zNear; |
| float zFar; |
| } camera; |
| |
| struct ClusterLights { |
| uint offset; |
| uint count; |
| }; |
| struct ClusterLightGroup { |
| uint offset; |
| ClusterLights lights[27648]; |
| uint indices[1769472]; |
| }; |
| |
| layout(binding = 1) buffer ClusterLightGroup_1 { |
| uint offset; |
| ClusterLights lights[27648]; |
| uint indices[1769472]; |
| } clusterLights; |
| |
| struct Light { |
| vec3 position; |
| float range; |
| vec3 color; |
| float intensity; |
| }; |
| |
| layout(binding = 2) buffer GlobalLights_1 { |
| vec3 ambient; |
| vec3 dirColor; |
| float dirIntensity; |
| vec3 dirDirection; |
| uint lightCount; |
| Light lights[]; |
| } globalLights; |
| const uvec3 tileCount = uvec3(32u, 18u, 48u); |
| |
| float linearDepth(float depthSample) { |
| return ((camera.zFar * camera.zNear) / mad(depthSample, (camera.zNear - camera.zFar), camera.zFar)); |
| } |
| |
| uvec3 getTile(vec4 fragCoord) { |
| float sliceScale = (float(tileCount.z) / log2((camera.zFar / camera.zNear))); |
| float sliceBias = -(((float(tileCount.z) * log2(camera.zNear)) / log2((camera.zFar / camera.zNear)))); |
| uint zTile = uint(max(((log2(linearDepth(fragCoord.z)) * sliceScale) + sliceBias), 0.0f)); |
| return uvec3(uint((fragCoord.x / (camera.outputSize.x / float(tileCount.x)))), uint((fragCoord.y / (camera.outputSize.y / float(tileCount.y)))), zTile); |
| } |
| |
| uint getClusterIndex(vec4 fragCoord) { |
| uvec3 tile = getTile(fragCoord); |
| return ((tile.x + (tile.y * tileCount.x)) + ((tile.z * tileCount.x) * tileCount.y)); |
| } |
| |
| layout(binding = 6) buffer LightShadowTable_1 { |
| int light[]; |
| } lightShadowTable; |
| vec2 shadowSampleOffsets[16] = vec2[16](vec2(-1.5f, -1.5f), vec2(-1.5f, -0.5f), vec2(-1.5f, 0.5f), vec2(-1.5f, 1.5f), vec2(-0.5f, -1.5f), vec2(-0.5f, -0.5f), vec2(-0.5f, 0.5f), vec2(-0.5f, 1.5f), vec2(0.5f, -1.5f), vec2(0.5f, -0.5f), vec2(0.5f, 0.5f), vec2(0.5f, 1.5f), vec2(1.5f, -1.5f), vec2(1.5f, -0.5f), vec2(1.5f, 0.5f), vec2(1.5f, 1.5f)); |
| const uint shadowSampleCount = 16u; |
| |
| struct ShadowProperties { |
| vec4 viewport; |
| mat4 viewProj; |
| }; |
| |
| layout(binding = 7) buffer LightShadows_1 { |
| ShadowProperties properties[]; |
| } shadow; |
| uniform highp sampler2D shadowTexture_1; |
| uniform highp sampler2D shadowTexture_shadowSampler; |
| |
| |
| float dirLightVisibility(vec3 worldPos) { |
| int shadowIndex = lightShadowTable.light[0u]; |
| if ((shadowIndex == -1)) { |
| return 1.0f; |
| } |
| vec4 viewport = shadow.properties[shadowIndex].viewport; |
| vec4 lightPos = (shadow.properties[shadowIndex].viewProj * vec4(worldPos, 1.0f)); |
| vec3 shadowPos = vec3((((lightPos.xy / lightPos.w) * vec2(0.5f, -0.5f)) + vec2(0.5f, 0.5f)), (lightPos.z / lightPos.w)); |
| vec2 viewportPos = vec2((viewport.xy + (shadowPos.xy * viewport.zw))); |
| vec2 texelSize = (1.0f / vec2(textureSize(shadowTexture_1, 0))); |
| vec4 clampRect = vec4((viewport.xy - texelSize), ((viewport.xy + viewport.zw) + texelSize)); |
| float visibility = 0.0f; |
| { |
| for(uint i = 0u; (i < shadowSampleCount); i = (i + 1u)) { |
| visibility = (visibility + texture(shadowTexture_shadowSampler, clamp((viewportPos + (shadowSampleOffsets[i] * texelSize)), clampRect.xy, clampRect.zw), (shadowPos.z - 0.003f))); |
| } |
| } |
| return (visibility / float(shadowSampleCount)); |
| } |
| |
| int getCubeFace(vec3 v) { |
| vec3 vAbs = abs(v); |
| bool tint_tmp = (vAbs.z >= vAbs.x); |
| if (tint_tmp) { |
| tint_tmp = (vAbs.z >= vAbs.y); |
| } |
| if ((tint_tmp)) { |
| if ((v.z < 0.0f)) { |
| return 5; |
| } |
| return 4; |
| } |
| if ((vAbs.y >= vAbs.x)) { |
| if ((v.y < 0.0f)) { |
| return 3; |
| } |
| return 2; |
| } |
| if ((v.x < 0.0f)) { |
| return 1; |
| } |
| return 0; |
| } |
| |
| float pointLightVisibility(uint lightIndex, vec3 worldPos, vec3 pointToLight) { |
| int shadowIndex = lightShadowTable.light[(lightIndex + 1u)]; |
| if ((shadowIndex == -1)) { |
| return 1.0f; |
| } |
| shadowIndex = (shadowIndex + getCubeFace((pointToLight * -1.0f))); |
| vec4 viewport = shadow.properties[shadowIndex].viewport; |
| vec4 lightPos = (shadow.properties[shadowIndex].viewProj * vec4(worldPos, 1.0f)); |
| vec3 shadowPos = vec3((((lightPos.xy / lightPos.w) * vec2(0.5f, -0.5f)) + vec2(0.5f, 0.5f)), (lightPos.z / lightPos.w)); |
| vec2 viewportPos = vec2((viewport.xy + (shadowPos.xy * viewport.zw))); |
| vec2 texelSize = (1.0f / vec2(textureSize(shadowTexture_1, 0))); |
| vec4 clampRect = vec4(viewport.xy, (viewport.xy + viewport.zw)); |
| float visibility = 0.0f; |
| { |
| for(uint i = 0u; (i < shadowSampleCount); i = (i + 1u)) { |
| visibility = (visibility + texture(shadowTexture_shadowSampler, clamp((viewportPos + (shadowSampleOffsets[i] * texelSize)), clampRect.xy, clampRect.zw), (shadowPos.z - 0.01f))); |
| } |
| } |
| return (visibility / float(shadowSampleCount)); |
| } |
| |
| struct VertexOutput { |
| vec4 position; |
| vec3 worldPos; |
| vec3 view; |
| vec2 texcoord; |
| vec2 texcoord2; |
| vec4 color; |
| vec4 instanceColor; |
| vec3 normal; |
| vec3 tangent; |
| vec3 bitangent; |
| }; |
| struct Material { |
| vec4 baseColorFactor; |
| vec3 emissiveFactor; |
| float occlusionStrength; |
| vec2 metallicRoughnessFactor; |
| float alphaCutoff; |
| }; |
| |
| layout(binding = 8) uniform Material_1 { |
| vec4 baseColorFactor; |
| vec3 emissiveFactor; |
| float occlusionStrength; |
| vec2 metallicRoughnessFactor; |
| float alphaCutoff; |
| } material; |
| |
| struct SurfaceInfo { |
| vec4 baseColor; |
| vec3 albedo; |
| float metallic; |
| float roughness; |
| vec3 normal; |
| vec3 f0; |
| float ao; |
| vec3 emissive; |
| vec3 v; |
| }; |
| |
| uniform highp sampler2D normalTexture_normalSampler; |
| uniform highp sampler2D baseColorTexture_baseColorSampler; |
| uniform highp sampler2D metallicRoughnessTexture_metallicRoughnessSampler; |
| uniform highp sampler2D occlusionTexture_occlusionSampler; |
| uniform highp sampler2D emissiveTexture_emissiveSampler; |
| |
| |
| SurfaceInfo GetSurfaceInfo(VertexOutput tint_symbol) { |
| SurfaceInfo surface = SurfaceInfo(vec4(0.0f, 0.0f, 0.0f, 0.0f), vec3(0.0f, 0.0f, 0.0f), 0.0f, 0.0f, vec3(0.0f, 0.0f, 0.0f), vec3(0.0f, 0.0f, 0.0f), 0.0f, vec3(0.0f, 0.0f, 0.0f), vec3(0.0f, 0.0f, 0.0f)); |
| surface.v = normalize(tint_symbol.view); |
| mat3 tbn = mat3(tint_symbol.tangent, tint_symbol.bitangent, tint_symbol.normal); |
| vec3 normalMap = texture(normalTexture_normalSampler, tint_symbol.texcoord).rgb; |
| surface.normal = normalize((tbn * ((2.0f * normalMap) - vec3(1.0f)))); |
| vec4 baseColorMap = texture(baseColorTexture_baseColorSampler, tint_symbol.texcoord); |
| surface.baseColor = ((tint_symbol.color * material.baseColorFactor) * baseColorMap); |
| if ((surface.baseColor.a < material.alphaCutoff)) { |
| discard; |
| } |
| surface.albedo = surface.baseColor.rgb; |
| vec4 metallicRoughnessMap = texture(metallicRoughnessTexture_metallicRoughnessSampler, tint_symbol.texcoord); |
| surface.metallic = (material.metallicRoughnessFactor.x * metallicRoughnessMap.b); |
| surface.roughness = (material.metallicRoughnessFactor.y * metallicRoughnessMap.g); |
| vec3 dielectricSpec = vec3(0.039999999f); |
| surface.f0 = mix(dielectricSpec, surface.albedo, vec3(surface.metallic)); |
| vec4 occlusionMap = texture(occlusionTexture_occlusionSampler, tint_symbol.texcoord); |
| surface.ao = (material.occlusionStrength * occlusionMap.r); |
| vec4 emissiveMap = texture(emissiveTexture_emissiveSampler, tint_symbol.texcoord); |
| surface.emissive = (material.emissiveFactor * emissiveMap.rgb); |
| if ((tint_symbol.instanceColor.a == 0.0f)) { |
| surface.albedo = (surface.albedo + tint_symbol.instanceColor.rgb); |
| } else { |
| surface.albedo = (surface.albedo * tint_symbol.instanceColor.rgb); |
| } |
| return surface; |
| } |
| |
| const float PI = 3.141592741f; |
| const uint LightType_Point = 0u; |
| const uint LightType_Directional = 2u; |
| |
| struct PuctualLight { |
| uint lightType; |
| vec3 pointToLight; |
| float range; |
| vec3 color; |
| float intensity; |
| }; |
| |
| vec3 FresnelSchlick(float cosTheta, vec3 F0) { |
| return (F0 + ((vec3(1.0f) - F0) * pow((1.0f - cosTheta), 5.0f))); |
| } |
| |
| float DistributionGGX(vec3 N, vec3 H, float roughness) { |
| float a_1 = (roughness * roughness); |
| float a2 = (a_1 * a_1); |
| float NdotH = max(dot(N, H), 0.0f); |
| float NdotH2 = (NdotH * NdotH); |
| float num = a2; |
| float denom = ((NdotH2 * (a2 - 1.0f)) + 1.0f); |
| return (num / ((PI * denom) * denom)); |
| } |
| |
| float GeometrySchlickGGX(float NdotV, float roughness) { |
| float r_1 = (roughness + 1.0f); |
| float k = ((r_1 * r_1) / 8.0f); |
| float num = NdotV; |
| float denom = ((NdotV * (1.0f - k)) + k); |
| return (num / denom); |
| } |
| |
| float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness) { |
| float NdotV = max(dot(N, V), 0.0f); |
| float NdotL = max(dot(N, L), 0.0f); |
| float ggx2 = GeometrySchlickGGX(NdotV, roughness); |
| float ggx1 = GeometrySchlickGGX(NdotL, roughness); |
| return (ggx1 * ggx2); |
| } |
| |
| float lightAttenuation(PuctualLight light) { |
| if ((light.lightType == LightType_Directional)) { |
| return 1.0f; |
| } |
| float tint_symbol_1 = length(light.pointToLight); |
| if ((light.range <= 0.0f)) { |
| return (1.0f / pow(tint_symbol_1, 2.0f)); |
| } |
| return (clamp((1.0f - pow((tint_symbol_1 / light.range), 4.0f)), 0.0f, 1.0f) / pow(tint_symbol_1, 2.0f)); |
| } |
| |
| vec3 lightRadiance(PuctualLight light, SurfaceInfo surface) { |
| vec3 L = normalize(light.pointToLight); |
| vec3 H = normalize((surface.v + L)); |
| float NDF = DistributionGGX(surface.normal, H, surface.roughness); |
| float G = GeometrySmith(surface.normal, surface.v, L, surface.roughness); |
| vec3 F = FresnelSchlick(max(dot(H, surface.v), 0.0f), surface.f0); |
| vec3 kD = ((vec3(1.0f) - F) * (1.0f - surface.metallic)); |
| float NdotL = max(dot(surface.normal, L), 0.0f); |
| vec3 numerator = ((NDF * G) * F); |
| float denominator = max(((4.0f * max(dot(surface.normal, surface.v), 0.0f)) * NdotL), 0.001f); |
| vec3 specular = (numerator / vec3(denominator)); |
| vec3 radiance = ((light.color * light.intensity) * lightAttenuation(light)); |
| return (((((kD * surface.albedo) / vec3(PI)) + specular) * radiance) * NdotL); |
| } |
| |
| struct FragmentOutput { |
| vec4 color; |
| vec4 emissive; |
| }; |
| struct tint_symbol_4 { |
| vec3 worldPos; |
| vec3 view; |
| vec2 texcoord; |
| vec2 texcoord2; |
| vec4 color; |
| vec4 instanceColor; |
| vec3 normal; |
| vec3 tangent; |
| vec3 bitangent; |
| vec4 position; |
| }; |
| struct tint_symbol_5 { |
| vec4 color; |
| vec4 emissive; |
| }; |
| |
| uniform highp sampler2D ssaoTexture_1; |
| uniform highp sampler2D ssaoTexture_defaultSampler; |
| |
| FragmentOutput fragmentMain_inner(VertexOutput tint_symbol) { |
| SurfaceInfo surface = GetSurfaceInfo(tint_symbol); |
| vec3 Lo = vec3(0.0f, 0.0f, 0.0f); |
| if ((globalLights.dirIntensity > 0.0f)) { |
| PuctualLight light = PuctualLight(0u, vec3(0.0f, 0.0f, 0.0f), 0.0f, vec3(0.0f, 0.0f, 0.0f), 0.0f); |
| light.lightType = LightType_Directional; |
| light.pointToLight = globalLights.dirDirection; |
| light.color = globalLights.dirColor; |
| light.intensity = globalLights.dirIntensity; |
| float lightVis = dirLightVisibility(tint_symbol.worldPos); |
| Lo = (Lo + (lightRadiance(light, surface) * lightVis)); |
| } |
| uint clusterIndex = getClusterIndex(tint_symbol.position); |
| uint lightOffset = clusterLights.lights[clusterIndex].offset; |
| uint lightCount = clusterLights.lights[clusterIndex].count; |
| { |
| for(uint lightIndex = 0u; (lightIndex < lightCount); lightIndex = (lightIndex + 1u)) { |
| uint i = clusterLights.indices[(lightOffset + lightIndex)]; |
| PuctualLight light = PuctualLight(0u, vec3(0.0f, 0.0f, 0.0f), 0.0f, vec3(0.0f, 0.0f, 0.0f), 0.0f); |
| light.lightType = LightType_Point; |
| light.pointToLight = (globalLights.lights[i].position.xyz - tint_symbol.worldPos); |
| light.range = globalLights.lights[i].range; |
| light.color = globalLights.lights[i].color; |
| light.intensity = globalLights.lights[i].intensity; |
| float lightVis = pointLightVisibility(i, tint_symbol.worldPos, light.pointToLight); |
| Lo = (Lo + (lightRadiance(light, surface) * lightVis)); |
| } |
| } |
| vec2 ssaoCoord = (tint_symbol.position.xy / vec2(textureSize(ssaoTexture_1, 0).xy)); |
| float ssaoFactor = texture(ssaoTexture_defaultSampler, ssaoCoord).r; |
| vec3 ambient = (((globalLights.ambient * surface.albedo) * surface.ao) * ssaoFactor); |
| vec3 color = linearTosRGB(((Lo + ambient) + surface.emissive)); |
| FragmentOutput tint_symbol_2 = FragmentOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), vec4(0.0f, 0.0f, 0.0f, 0.0f)); |
| tint_symbol_2.color = vec4(color, surface.baseColor.a); |
| tint_symbol_2.emissive = vec4(surface.emissive, surface.baseColor.a); |
| return tint_symbol_2; |
| } |
| |
| tint_symbol_5 fragmentMain(tint_symbol_4 tint_symbol_3) { |
| VertexOutput tint_symbol_6 = VertexOutput(tint_symbol_3.position, tint_symbol_3.worldPos, tint_symbol_3.view, tint_symbol_3.texcoord, tint_symbol_3.texcoord2, tint_symbol_3.color, tint_symbol_3.instanceColor, tint_symbol_3.normal, tint_symbol_3.tangent, tint_symbol_3.bitangent); |
| FragmentOutput inner_result = fragmentMain_inner(tint_symbol_6); |
| tint_symbol_5 wrapper_result = tint_symbol_5(vec4(0.0f, 0.0f, 0.0f, 0.0f), vec4(0.0f, 0.0f, 0.0f, 0.0f)); |
| wrapper_result.color = inner_result.color; |
| wrapper_result.emissive = inner_result.emissive; |
| return wrapper_result; |
| } |
| layout(location = 0) in vec3 worldPos; |
| layout(location = 1) in vec3 view; |
| layout(location = 2) in vec2 texcoord; |
| layout(location = 3) in vec2 texcoord2; |
| layout(location = 4) in vec4 color; |
| layout(location = 5) in vec4 instanceColor; |
| layout(location = 6) in vec3 normal; |
| layout(location = 7) in vec3 tangent; |
| layout(location = 8) in vec3 bitangent; |
| layout(location = 0) out vec4 color; |
| layout(location = 1) out vec4 emissive; |
| void main() { |
| tint_symbol_4 inputs; |
| inputs.worldPos = worldPos; |
| inputs.view = view; |
| inputs.texcoord = texcoord; |
| inputs.texcoord2 = texcoord2; |
| inputs.color = color; |
| inputs.instanceColor = instanceColor; |
| inputs.normal = normal; |
| inputs.tangent = tangent; |
| inputs.bitangent = bitangent; |
| inputs.position = gl_FragCoord; |
| tint_symbol_5 outputs; |
| outputs = fragmentMain(inputs); |
| color = outputs.color; |
| emissive = outputs.emissive; |
| } |
| |
| |
| Error parsing GLSL shader: |
| ERROR: 0:67: 'mad' : no matching overloaded function found |
| ERROR: 0:67: '' : compilation terminated |
| ERROR: 2 compilation errors. No code generated. |
| |
| |
| |