当我切换到仅alpha(A8)pixelFormat时,为什么我的片段着色器无法读取alpha信息?

时间:2011-03-03 23:26:37

标签: iphone ios opengl-es opengl-es-2.0 fragment-shader

我正在创建一个使用OpenGL ES 2.0的iOS应用。我对OpenGL有些新意,所以这可能是一个微不足道的错误。

我创建了一个简单的着色器,使用alpha通道处理一个纹理与另一个纹理。掩码纹理初始化如下:

  

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

     

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,name,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-only像素格式作为掩码纹理。但是,如果我从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,所以它似乎应该继续工作。任何想法为什么不呢?

1 个答案:

答案 0 :(得分:2)

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