GLSL:启用/禁用纹理+着色器
题
我在寻找一种方式来从着色器访问OpenGL的状态。该 GLSL快速参考指南,一个真棒资源,不能真正帮我出这一点。
在该示例我正在我有以下两种着色器:
顶点:
void main()
{
gl_FrontColor = gl_Color;
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_Position = ftransform();
}
片段:
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;
}
当我渲染未纹理多边形,它们的α值是正确的,但他们指定的颜色为黑色。
1,什么条件检查可以予设置,使变量“纹理像素”将被设置一个vec4(1.0, 1.0, 1.0, 1.0)
而不是从纹理采样时GL_TEXTURE_2D
禁用?
2;将所述处理更快,如果我写为不同的纹理化模式和它们之间的切换不同着色器我想去使用glEnable
/ glDisable
(GL_TEXTURE_2D
)?
解决方案
很抱歉,但你不能从GLSL,期间访问样的状态。
事实上,在未来GLSL,你必须把所有unforms /自己的属性,即没有AUTOMAGIC gl_ModelViewMatrix,gl_LightPosition,gl_Normal等。只有像GL_POSITION和gl_FragColor基本的东西是可用的。
之类的空洞你的第二个问题,但你总是可以使用的#ifdef启用/在你的着色器禁用部分,如果你发现比编写单独的着色器不同质地的模式更方便。
相关,做到注意分支通常是相当缓慢,所以如果你有速度的需求也避免它尽可能。 (这一点很重要尤其不规则动态分支,如片段在SIMD块进行处理,并在块中的所有片段必须计算相同的指令,即使它们只适用于一个或几个片段。)
其他提示
我看到的一种方法是1x1的纹理结合具有的单个纹素(1.0,1.0,1.0,1.0)呈现未纹理化的多边形时。纹理开关应较便宜比着色器开关和一个1x1纹理将完全配合在纹理高速缓存内。
不隶属于 StackOverflow