我试图从拜耳缓冲区渲染视频。
所以我使用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会给我黑色纹理?如何使这个工作?
答案 0 :(得分:0)
猜测:
设置GL_CLAMP_TO_EDGE
*和GL_LINEAR
或GL_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立方体完成的纹理。
...所以我的猜测是检查第一和第三个要点。