【问题标题】:GLES2 : glTexImage2D with GL_LUMINANCE give me black screen/textureGLES2:带有 GL_LUMINANCE 的 glTexImage2D 给我黑屏/纹理
【发布时间】:2016-03-23 11:33:03
【问题描述】:

我正在尝试从拜耳缓冲区渲染视频。

所以我使用 GL_LUMINANCE/GL_UNSIGNED_BYTE 创建了一个纹理。我在这个纹理上应用了一些着色器来生成 RGBA 输出。

以下调用在我的 PC 上运行良好,但在目标板 (iMX6/GLES2) 上运行不正常:

glTexImage2D(GL_TEXTURE_2D, 0, textureFormat, m_texture_size.width(), m_texture_size.height(), 0, bufferFormat, GL_UNSIGNED_BYTE, imageData);

在目标板上,我有黑色纹理。

bufferFormat 是 GL_LUMINANCE。 textureFormat 是 GL_LUMINANCE。

GLES2 实现了一个较小的 OpenGL API 子集: https://www.khronos.org/opengles/sdk/docs/man/xhtml/glTexImage2D.xml

bufferFormat 应该等于 textureFormat。如果我尝试其他格式,它可以在 PC 上运行。在目标板上,我得到一个黑屏和 glGetError() 报告的一些错误。

其他测试失败

如果我尝试 GL_ALPHA,纹理似乎被 (0,0,0,1) 填充。

如果我尝试使用 GL_RGBA/GL_RGBA(这对应用程序没有意义,但它会检查硬件/API 功能),我会在板上看到非黑色纹理。显然,图像不是我所期望的。

为什么 GL_LUMINANCE 给我黑色纹理?如何使它工作?

【问题讨论】:

    标签: opengl-es


    【解决方案1】:

    猜测:

    1. 纹理不是二维的幂,并且您没有设置兼容的环绕模式;
    2. 您没有设置适当的 mip 映射模式,因此着色器正在对您上传的级别以外的级别进行采样。

    设置GL_CLAMP_TO_EDGE* 和GL_LINEARGL_NEAREST 而不是GL_LINEAR_MIPMAP_... 可以解决问题吗?

    根据ES 2 spec 的第 3.8.2 节(警告:PDF):

    如果满足以下任一条件,则从片段着色器调用采样器将返回 (R, G, B, A) = (0,0,0,1):

    • 调用了一个二维采样器,缩小过滤器是一个需要 mipmap(既不是 NEAREST 也不是 LINEAR)的过滤器,并且采样器的关联纹理对象不完整,如第 3.7.1 和 3.7.10 节中所定义,

    • 调用二维采样器,缩小过滤器不是需要 mipmap(NEAREST 或 LINEAR)的过滤器,并且关联纹理对象的零级数组的任一维度都不是正数。

    • 调用二维采样器,对应的纹理图像是非二次幂图像(如第 3.7.7 节的 Mipmapping 讨论中所述),或者纹理环绕模式不是 CLAMP_TO_EDGE,或者缩小过滤器既不是 NEAREST 也不是 LINEAR。

    • 调用了立方体贴图采样器,任何对应的纹理图像都是非二次幂图像,并且纹理环绕模式不是 CLAMP_TO_EDGE,或者缩小过滤器既不是 NEAREST 也不是 LINEAR。

    • 调用了立方体贴图采样器,并且相应的立方体贴图纹理图像不是立方体完整的,或者 TEXTURE_MIN_FILTER 是需要 mipmap 并且纹理不是 mipmap 立方体完整的。

    ...所以我的猜测是检查第一个和第三个要点。

    【讨论】:

      猜你喜欢
      • 2017-03-30
      • 1970-01-01
      • 2020-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多