我在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显卡上的这种行为,我该怎么做才能避免它呢?谢谢。