Colors webgl丢弃片段,还要检查丢弃的颜色吗?

Colors webgl丢弃片段,还要检查丢弃的颜色吗?,colors,opengl-es,webgl,shader,textures,Colors,Opengl Es,Webgl,Shader,Textures,我试图丢弃一个片段,但我也希望能够将纹理上的颜色与纹理的其他部分进行比较。似乎如果碎片被丢弃,我就不能再检查纹理的那些区域了。 我怎样才能检查颜色,或者检查它是否被丢弃,这样它就不会检查,从而没有错误 下面是一些代码来说明这个问题 bool diagonal = (sS==0.0&&nS==0.0&&((cornerSign.x*cornerSign.y==1.0&&cC.rgb==cNW.rgb&&cNW.rgb==cSE

我试图丢弃一个片段,但我也希望能够将纹理上的颜色与纹理的其他部分进行比较。似乎如果碎片被丢弃,我就不能再检查纹理的那些区域了。 我怎样才能检查颜色,或者检查它是否被丢弃,这样它就不会检查,从而没有错误

下面是一些代码来说明这个问题

    bool diagonal = (sS==0.0&&nS==0.0&&((cornerSign.x*cornerSign.y==1.0&&cC.rgb==cNW.rgb&&cNW.rgb==cSE.rgb&&((cNE.rgb!=cC.rgb&&cornerSign.x>0.0&&cN.rgb==cE.rgb)||(cSW.rgb!=cC.rgb&&cornerSign.x<0.0&&cS.rgb==cW.rgb)) )||(cornerSign.x*cornerSign.y==-1.0&&cC.rgb==cNE.rgb&&cNE.rgb==cSW.rgb&&((cNW.rgb!=cC.rgb&&cornerSign.x<0.0&&cN.rgb==cW.rgb)||(cSE.rgb!=cC.rgb&&cornerSign.x>0.0&&cS.rgb==cE.rgb)) )));
    vec4 mixedColor = ((diagonal?vec4(0.0):step(1.0,tColor.a)*tColor)+(step(1.0,tColor2.a)*tColor2)+(step(1.0,tColor3.a)*tColor3)+(diagonal?vec4(0.0):(step(1.0,tColor4.a)*tColor4)))/(diagonal?step(1.0,tColor2.a)+step(1.0,tColor3.a):step(1.0,tColor.a)+step(1.0,tColor2.a)+step(1.0,tColor3.a)+step(1.0,tColor4.a));
    mixedColor.a = min(1.0,step(1.0,tColor2.a)+step(1.0,tColor3.a)+step(1.0,tColor4.a));
    vec4 newColor = (sS==0.0&&nS>=2.0)||(sS==0.0&&oS==2.0)||(sS==0.0&&tS==2.0&&fColor.rgb!=tColor.rgb)||diagonal?mixedColor:tColor;

    vec4 middlePart = (min(1.0,(1.0-step(subRadius,subDistance))+(1.0-step(1.0,subSign.x*cornerSign.x))+(1.0-step(1.0,subSign.y*cornerSign.y)))*(wedged?wedgeColor:tColor));
    vec4 outerPart = (clamp((step(subRadius,subDistance))-((1.0-step(1.0,subSign.x*cornerSign.x))+(1.0-step(1.0,subSign.y*cornerSign.y))),0.0,1.0)*(wedged?wedgeColor:newColor));
    //diagonals
    vec4 middlePartDiagonal = (min(1.0,(1.0-step(subRadius,abs(vUv.x-subPoint.x)+abs(vUv.y-subPoint.y)))+(1.0-step(1.0,subSign.x*cornerSign.x))+(1.0-step(1.0,subSign.y*cornerSign.y)))*tColor);
    vec4 outerPartDiagonal = (clamp((step(subRadius,abs(vUv.x-subPoint.x)+abs(vUv.y-subPoint.y)))-((1.0-step(1.0,subSign.x*cornerSign.x))+(1.0-step(1.0,subSign.y*cornerSign.y))),0.0,1.0)*newColor);
    gl_FragColor = (diagonal?middlePartDiagonal+outerPartDiagonal:middlePart+outerPart);

    vec4 tColor = texture2D(texture, vUv);
    vec4 colorTest = texture2D(texture, vUv+vec2(-1.0/textureWidth,1.0/textureHeight));

    gl_FragColor = tColor;
    if(gl_FragColor.a < 0.5 ) discard;
    else gl_FragColor = colorTest;
超过最大温度寄存器索引

此错误的确切含义是:编译器无法编译着色器,因为您需要的临时寄存器数量太多。这可能部分是由于编译器的愚蠢,没有回收不再被引用的变量。或者这可能是着色器的问题

我已经看到一个相当大的:

vec4 tColor = texture2D(texture, vUv);
这一行之前的所有代码都是完全无关的。为什么?因为这些变量中没有一个实际用于生成
gl\u FragColor
。只有用于生成对输出有影响的数据。基本上,您需要花费大量时间计算一个值,然后用非常简单的方法覆盖它:
tColor
testColor
。两者都不依赖于先前的计算

去掉所有不需要的计算

此外:

基于梯度的操作必须脱离流量控制,以防止发散。使用非梯度操作可以提高性能


这也暗示着你没有展示所有的东西。只有在非统一控制流(即:条件语句)中调用
texture
函数时,才会出现此警告。我在您的代码中没有看到这种非统一的控制流,但是有警告。这表明你的着色器中有更多的内容。

我通过重写着色器解决了这个问题,没有使用if/else条件,也没有数组和循环。
我只有一个if语句,没有错误或警告。

您显示的警告似乎表明您的问题比您在这里解释的更多。我们需要看到更多的代码。好的,我添加了更多的代码行。。也许这会显示我在做什么。。似乎当我移除复杂的东西时,它会运行。。所以我不确定为什么它不允许我检查被丢弃的颜色。我添加了更多的代码行来显示我在做什么。。也许那样的东西不好?你能看出它有什么毛病吗?
vec4 tColor = texture2D(texture, vUv);