我生成类似这样的纹理:
GLuint id;
glGenTextures(1, &id);
glBindTexture(GL_TEXTURE_2D, id);
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_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(
GL_TEXTURE_2D, 0,
GL_RGBA16,
//GL_RGBA16F_ARB, //< Won t work
256, 256, 0, GL_RGBA, GL_FLOAT, NULL
);
glBindTexture(GL_TEXTURE_2D, 0);
我将它附加到一个帧缓冲对象(FBO)上进行渲染。当我将内部格式设置为GL_RGBA16
时,这一切都像魅力一样工作。然而,我需要更高的动态范围,并考虑GL_RGBA16F_ARB
或许能解决问题。
很遗憾,如果我在上述代码中将GL_RGBA16
替换为GL_RGBA16F_ARB
,纹理似乎就停止工作了。无论我尝试渲染到FBO /纹理的内容都不粘在上面,当我使用纹理时它包含随机垃圾。 (结果显示大量紫色)如果我得到一个提示可能出了什么问题的错误消息,那么这将不那么令人沮丧,但我似乎找不到这样的消息。换句话说,在调用glTexImage2D
后,glGetError()
返回0
,并且在我附加纹理时,glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT)
返回GL_FRAMEBUFFER_COMPLETE_EXT
。
我还没有碰过glClampColorARB(...)
...就是 :)
- Have I forgotten to check for errors in a place/way that I haven t thought of?
- Do
GL_RGBA16F_ARB
-textures require any special treatment that I haven t given? - Is there anything else that might be wrong?
我很困惑,因为GL_RGBA16
一切都顺利运行... :(
编辑:使用GL_RGBA16F_ARB
时,我尝试将第一个帧渲染到屏幕上时失败了。 好像我应该在某个地方得到错误消息..?
通过检查ShadowIce的工作代码示例,我发现如果我在我的FBO上更改深度缓冲区并将glRenderBufferStorageEXT(...)
的第二个参数更改为GL_DEPTH_COMPONENT24
,而不是GL_DEPTH_COMPONENT16
,问题就会消失。我不知道为什么这样会起作用,但显然确实有效。
同样的,如果我在那里进行相反的替换,ShadowIce的代码也会像我的一样出错。