GLSL:启用/禁用纹理+着色器

zyn*_*dor 3 opengl shader glsl texturing

我正在寻找一种从着色器访问OpenGL状态的方法.该GLSL快速参考指南,一个真棒资源,无法真正帮助我在这一个.

在我正在研究的示例中,我有以下两个着色器:

顶点:

void    main()
{
    gl_FrontColor = gl_Color;
    gl_TexCoord[0] = gl_MultiTexCoord0;
    gl_Position = ftransform();
}
Run Code Online (Sandbox Code Playgroud)

分段:

uniform sampler2D   tex;
uniform float   flattening;

void main( void ) 
{
    vec4    texel;
    texel = texture2D(tex, gl_TexCoord[0].st);
    texel.r *= gl_Color.r;
    texel.g *= gl_Color.g;
    texel.b *= gl_Color.b;
    texel.a *= gl_Color.a;
    gl_FragColor = texel;
}
Run Code Online (Sandbox Code Playgroud)

当我渲染没有纹理的多边形时,它们的alpha值是正确的,但它们被指定为黑色.

1,我可以设置什么条件检查,以便vec4(1.0, 1.0, 1.0, 1.0)GL_TEXTURE_2D禁用时将变量'texel'设置为而不是从纹理中采样?

2,如果我为不同的纹理模式编写不同的着色器并在它们之间切换我将使用glEnable/ glDisable(GL_TEXTURE_2D),处理会更快吗?

Mac*_*cke 8

对不起,但你无法从GLSL,期间访问那种状态.

事实上,在未来的GLSL中你必须自己发送所有unforms /属性,即没有自动gl_ModelViewMatrix,gl_LightPosition,gl_Normal等.只有像gl_Position和gl_FragColor这样的基本内容才可用.

这样会使你的第二个问题无效,但如果你发现比为不同的纹理模式编写单独的着色器更方便,你总是可以使用#ifdef来启用/禁用着色器中的部件.

相关,请注意分支通常相当慢,所以如果您需要速度,请尽可能避免它.(这尤其是不规则的动态分支,因为片段在SIMD块中处理,并且块中的所有片段必须计算相同的指令,即使它们仅应用一个或几个片段.)