【问题标题】:Create And Write GL_ALPHA texture (OpenGL ES 2)创建并写入 GL_ALPHA 纹理 (OpenGL ES 2)
【发布时间】:2014-04-22 00:08:50
【问题描述】:

我是 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_FRAMEBUFFER_INCOMPLETE_ATTACHMENT

我也想知道如何在片段着色器中写入这个纹理。是不是跟 RGBA 是一样的,像这样:

gl_FragColor = vec1(0.5);

我的目的是使用高效的纹理,因为在我的代码中有很多纹理读取,而我只需要一个颜色组件。

感谢您为我提供的任何指导。

【问题讨论】:

    标签: ios opengl-es-2.0 fragment-shader texture2d render-to-texture


    【解决方案1】:

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

    提高纹理效率的更好方法是使用压缩格式,因为 GPU 使用专用硬件对它们进行解码。你真的需要 PowerVR Texture 压缩工具。免费下载:

    http://www.imgtec.com/powervr/insider/sdkdownloads/sdk_licence_agreement.asp

    【讨论】:

    • 谢谢!我去看看。
    【解决方案2】:

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

    为了绘制这个包含 4 个逻辑 Alpha 纹理的纹理,我使用着色器并创建一个符号位来标记我打算写入的颜色分量。 我使用的混合是

     (GL_ONE, GL_ONE_MINUS_SRC_COLOR), 
    

    片段着色器是这样的:

     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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-19
      相关资源
      最近更新 更多