使用相同的着色器处理GL_RGBA和GL_ALPHA纹理?

时间:2012-10-28 15:35:50

标签: opengl-es opengl-es-2.0 glsl

因此我的应用程序主要使用rgba纹理进行渲染,但在少数情况下,我使用alpha蒙版来渲染文本。

我希望我的片段着色器的输出是给定坐标处的纹理采样器的值乘以我传入的颜色均匀。问题是我找不到处理这两种情况的简单解决方案

因此,对于rgba纹理,这会得到所需的结果:

gl_FragColor = texture2D(diffuseTexture, varTexcoord.st, 0.0) * color;

但对于alpha纹理,输出始终为黑色。我假设纹理采样器将alpha纹理的每个像素视为:rgba(0,0,0,alpha),我希望它被视为rgba(1,1,1,alpha)。我可以使用以下方法在alpha纹理上获得所需的结果:

gl_FragColor = texture2D(diffuseTexture, varTexcoord.st, 0.0).w * color;

但显然这打破了rgba纹理。

我对GLSL很新,我想知道是否有一种处理这两种情况的好方法,或者我是否需要有两种不同的着色器,或者将我所有的aplha纹理转换为rgba。

修改

我认为在加载资产时,我最终会将我的alpha纹理重新打包为GL_LUMINANCE_ALPHA纹理。

1 个答案:

答案 0 :(得分:1)

您有两种不同的方式来处理数据。所以你有两个不同的着色器。切换它们。着色器反映了将要发生的事情。

如果您为glTexEnv,灯光等的每个设置使用旧的,降低的固定功能管道,则会在原位创建特定着色器。

切换着色器就像调用glUseProgramm

一样简单