GLES2:GLLUMINANCE的glTexImage2D给我黑屏/纹理

时间:2016-03-23 11:33:04

标签: opengl-es

我试图从拜耳缓冲区渲染视频。

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

以下调用在我的电脑上正常工作,而不在目标板上(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会给我黑色纹理?如何使这个工作?

1 个答案:

答案 0 :(得分:0)

猜测:

  1. 纹理在尺寸上不是2的幂,并且您没有设置兼容的包装模式;
  2. 您尚未设置适当的mip映射模式,因此着色器会采样您上传的级别以外的级别。
  3. 设置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。 / p>      

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

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