4

我正在创建一个使用 OpenGL ES 2.0 的 iOS 应用程序。我对 OpenGL 有点陌生,所以这可能是一个微不足道的错误。

我创建了一个简单的着色器来处理使用 alpha 通道用另一个纹理遮盖一个纹理。蒙版纹理初始化如下:

glGenTextures(1, &name); glBindTexture(GL_TEXTURE_2D, 名称);

glTexParameterf(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1024, 768, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);

glGenFramebuffersOES(1, &buffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, 缓冲区);

glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, 名称, 0);

glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0);

然后(稍后)我在遮罩纹理上绘制一些东西,并将遮罩纹理链接到这个片段着色器以将其应用到另一个纹理:

uniform sampler2D baseTextureSampler;
uniform sampler2D maskTextureSampler;
varying lowp vec4 colorVarying;
varying mediump vec2 textureCoordsVarying;  
varying mediump vec2 positionVarying; 

void main() {

      lowp vec4 texel = texture2D(baseTextureSampler, textureCoordsVarying);
      lowp vec4 maskTexel = texture2D(maskTextureSampler, positionVarying);

      gl_FragColor = texel*colorVarying*maskTexel.a; 
}

这完全呈现了我想要的样子。但是,为了减少绑定蒙版纹理缓冲区的开销(这似乎很大),我尝试对蒙版纹理使用 8 位仅 alpha 像素格式。但是,如果我从 RGBA 设置中更改代码:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1024, 768, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);

...仅 alpha 版:

glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 1024, 768, 0, GL_ALPHA, GL_UNSIGNED_BYTE, 缓冲区);

...片段着色器无法绘制任何内容。因为我首先只使用蒙版纹理中的 alpha,所以它似乎应该继续工作。任何想法为什么它不?

4

1 回答 1

2

OpenGL ES 2.0 规范(或 GL_OES_framebuffer_object 扩展)没有定义任何只有 alpha 位的可渲染格式,因此不支持它们。您必须使用 RGBA 格式。

于 2011-03-04T04:09:16.420 回答