Ios 创建和写入GL_ALPHA纹理(OpenGL ES 2)

Ios 创建和写入GL_ALPHA纹理(OpenGL ES 2),ios,opengl-es-2.0,fragment-shader,texture2d,render-to-texture,Ios,Opengl Es 2.0,Fragment Shader,Texture2d,Render To Texture,我是OpenGL新手,所以我不知道该怎么做。 目前,我正在iOS中创建Alpha纹理: GLuint framebuffer, renderBufferT; glGenFramebuffers(1, &framebuffer); glGenTextures(1, &renderBufferT); glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); glBindTexture(GL_TEXTURE_2D, renderBufferT);

我是OpenGL新手,所以我不知道该怎么做。 目前,我正在iOS中创建Alpha纹理:

GLuint framebuffer, renderBufferT;
glGenFramebuffers(1, &framebuffer);
glGenTextures(1, &renderBufferT);
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glBindTexture(GL_TEXTURE_2D, renderBufferT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, width, height, 0, GL_ALPHA, GL_UNSIGNED_BYTE, NULL);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renderBufferT, 0);

GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if(status != GL_FRAMEBUFFER_COMPLETE)
{
    NSLog(@"createAlphaBufferWithSize not complete %x", status);
    return NO;
}
但它返回一个错误:GL\u FRAMEBUFFER\u未完成\u附件

我还想知道如何在片段着色器中写入此纹理。RGBA是否也一样,如下所示:

gl_FragColor = vec1(0.5);
 uniform lowp vec4 uSignBit;
 void main()
 {
     lowp vec4 textureColor = texture2D(uTexture,vTexCoord);
     gl_FragColor = uSignBit * textureColor.a;
 }
我的意图是使用有效的纹理,因为在我的代码中有太多的纹理读取,而我只需要颜色的一个组件


感谢您为我提供的指导。

我不是iOS爱好者,但该错误表明您的OpenGL ES驱动程序(PowerVR)不支持渲染为GL_ALPHA格式。我还没有看到任何OpenGL ES驱动程序可以在任何平台上实现这一点。您可以使用PowerVR SDK中的纹理压缩工具创建用于OpenGL ES的GL_ALPHA纹理,但我认为您可以渲染到的最小格式将是16位颜色-如果可以的话

提高纹理效率的更好方法是使用压缩格式,因为GPU使用专用硬件对其进行解码。您确实需要PowerVR纹理压缩工具。这是一个免费下载:


因此,我仍然没有找到上述问题的答案,但我找到了解决办法。 本质上,由于每个像素由4个颜色分量组成,我只需要一个用于alpha,那么我要做的就是使用一个纹理来存储我需要的4个不同的逻辑alpha纹理。维护这些逻辑alpha纹理需要一些努力

为了绘制这个包含4个逻辑alpha纹理的纹理,我使用了一个着色器并创建了一个符号位来标记我要写入的颜色组件。 我用的混合物是

 (GL_ONE, GL_ONE_MINUS_SRC_COLOR), 
片段着色器如下所示:

gl_FragColor = vec1(0.5);
 uniform lowp vec4 uSignBit;
 void main()
 {
     lowp vec4 textureColor = texture2D(uTexture,vTexCoord);
     gl_FragColor = uSignBit * textureColor.a;
 }
因此,当我打算将某个纹理的alpha值写入逻辑alpha纹理编号2时,我会写入:

 glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR);
 glUniform4f(uSignBit, 0.0, 1.0, 0.0, 0.0);

谢谢我去看看。