[Public WebGL] Indexing samplerCube(Shadow) causes shader compilation error.

Ken Russell ([email protected]) [email protected]
Fri Jul 12 14:17:00 PDT 2019


This limitation in OpenGL ES 3.00 is discussed in its specification
available here:
https://www.khronos.org/registry/OpenGL/index_es.php

Section 12.30 "Dynamic Indexing" states:

"Indexing of arrays of samplers by constant-index-expressions is supported
in GLSL ES 1.00. A constant- index-expression is an expression formed from
constant-expressions and certain loop indices, defined for a subset of loop
constructs. Should this functionality be included in GLSL ES 3.00?

RESOLUTION: No. Arrays of samplers may only be indexed by
constant-integral-expressions."

WebGL implementations should be doing a better job of rejecting this
construct on all platforms. Thanks Jeff for putting together the test case.

Anton, you could work around this using a switch statement and using a
constant index into the array in each arm. Assuming all of the fragments
for a given triangle go down the same path I think this won't cause
divergent behavior in the shader and should be reasonably fast.

-Ken


On Fri, Jul 12, 2019 at 2:08 PM Jeff Gilbert ([email protected]) <
[email protected]> wrote:

>
> I'm adding a test for this:
> https://github.com/KhronosGroup/WebGL/pull/2910
>
> On Fri, Jul 12, 2019 at 1:45 PM Jeff Gilbert <[email protected]> wrote:
> >
> > Unfortunately, the Android behavior is correct, and the desktop
> > behavior is incorrect for essl300.
> > I made a testcase: https://jsfiddle.net/7kbLg6v1/3/
> >
> > On Fri, Jul 12, 2019 at 3:42 AM Anton Sedov ([email protected])
> > <[email protected]> wrote:
> > >
> > > Indexing samplerCube and samplerCubeShadow causes shader compilation
> error.
> > >
> > > Consider the case below:
> > >
> > >     #define LIGHTS_COUNT 4
> > >     #define SHADOW_CASTERS_COUNT 3
> > >
> > >     // Provides relations between shadow casters and lights
> > >     uniform int shadowCastersMask[LIGHTS_COUNT];
> > >
> > >     #ifdef GLES_3
> > >         uniform highp samplerCubeShadow
> shadowCastersSamplers[SHADOW_CASTERS_COUNT];
> > >     #else
> > >         uniform highp samplerCube
> shadowCastersSamplers[SHADOW_CASTERS_COUNT];
> > >     #endif
> > >
> > >     ...
> > >
> > >     for (int lightIndex = 0; lightIndex < LIGHTS_COUNT; ++lightIndex) {
> > >         ...
> > >
> > >         float shaded = 0.0;
> > >
> > >         int shadowCasterIndex = shadowCastersMask[lightIndex];
> > >
> > >         if (shadowCasterIndex == -1)
> > >             continue;
> > >
> > >         for (int samplingIndex = 0; samplingIndex <
> SHADOW_CASTERS_COUNT; ++samplingIndex) {
> > >             if (samplingIndex != shadowCasterIndex) continue;
> > >
> > >             float currentDepth = ...
> > >             vec4 samplingVector = ...
> > >
> > >     #ifdef GLES_3
> > >             shaded = 1.0 -
> texture(shadowCastersSamplers[samplingIndex], samplingVector);
> > >     #else
> > >             float closestDepth =
> textureCube(shadowCastersSamplers[samplingIndex], vec3(samplingVector)).r;
> > >             shaded = currentDepth > closestDepth ? 1.0 : 0.0;
> > >     #endif
> > >             break;
> > >         }
> > >
> > >         ...
> > >
> > >         diffuseColor *= 1.0 - shaded;
> > >         specularColor *= 1.0 - shaded;
> > >
> > >         ...
> > >     }
> > >
> > > When you will try to compile the code above on android browser with
> WebGL 2 rendering context enabled you get:
> > >
> > >     'samplerCubeShadow' : requires extension GL_EXT_gpu_shader5 to be
> enabled
> > >     '[' :  indexing into a sampler array using a non-constant
> expression is not permitted
> > >
> > > The same code works perfect on PC with WebGL 1 / WebGL 2 context, but
> on android browsers with WebGL 1 rendering context only.
> > >
> > > Note that replacing 'samplerCubeShadow' by 'samplerCube' doesn't
> change nothing.
> > > As you can see the code valid on WebGL 1 rendering context doesn't
> work on second context.
> > > Looks like a bug, isn't it?
> > >
> > > Chrome version is 75.0.3770.101. Firefox version is 68.0.
> > > Android versions: 7.0, 8.0, 9.0.
> > >
> > > ATTENTION: This message with all the attachments contains confidential
> information. Review, transfer, distribution, disclosure or use of received
> information is prohibited for the unauthorized recipient.
>
> -----------------------------------------------------------
> You are currently subscribed to [email protected]
> To unsubscribe, send an email to [email protected] with
> the following command in the body of your email:
> unsubscribe public_webgl
> -----------------------------------------------------------
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://khronos.org/pipermail/public_webgl_khronos.org/attachments/20190712/a408cb9a/attachment.html>


More information about the public_webgl mailing list