GLSL alpha测试在NVIDIA上进行了优化

时间:2016-08-18 21:54:37

标签: opengl glsl nvidia alpha fragment-shader

我在glsl上有一个小片段着色器,当我想渲染阴影纹理时使用。为了从具有alpha通道的纹理(如树叶)获得所需的阴影,使用alpha测试。

#version 130
in lowp vec2 UV; //comes from vertex shader, works fine

uniform sampler2D DiffuseTextureSampler; //ok, alpha channel IS present in passed texture

void main(){
    lowp vec4 MaterialDiffuseColor = texture( DiffuseTextureSampler, UV ).rgba;
    if(MaterialDiffuseColor.a < 0.5)
    {
        discard;
    }
    //no color output is required at this stage
}

以下着色器适用于英特尔卡(HD 520&amp;&amp; HD Graphics 3000),但在NVIDIA(420M和GTX 660,分别在Win7和Linux Mint 17.3上,使用最新的驱动程序,37x.xx)。 ..)alpha测试不起作用。 Shader确实编译没有任何错误,因此看起来NVIDIA优化器正在做奇怪的事情。

我已经将'fullbright'着色器的部分复制粘贴到'阴影'着色器,并得到了这个奇怪的结果,虽然有很多无用的东西(用于阴影渲染),但它确实可以正常工作。 / p>

#version 130
in lowp vec2 UV;
in lowp float fade;

out lowp vec4 color;

uniform sampler2D DiffuseTextureSampler;
uniform bool overlayBool;
uniform lowp float translucencyAlpha;
uniform lowp float useImageAlpha;

void main(){
    lowp vec4 MaterialDiffuseColor = texture( DiffuseTextureSampler, UV ).rgba;
    //notice the added OR :/
    if(MaterialDiffuseColor.a < 0.5 || overlayBool)
    {
        discard;
    }
    //next line is meaningless
    color = vec4(0.0, 0.0, 1.0, min(translucencyAlpha * useImageAlpha, fade));
}

如果我删除任何制服,或更改某些内容(例如,用一些算术替换min函数,保存均匀变量的声明但不使用它等),alpha测试会再次中断。   只输出颜色不起作用(即color = vec4(1.0,1.0,1.0,1.0);没有效果。)

我尝试使用

#pragma optimize (off)

但它没有帮助。

顺便说一下,当alpha测试被破坏时,表达式“MaterialDiffuseColor.a == 0.0”为真。

很抱歉,如果这是一个愚蠢的问题,但是什么原因导致NVIDIA显卡上的这种行为,我该怎么做才能避免它呢?谢谢。

0 个答案:

没有答案