English 中文(简体)
当使用GL_RGBA16F_ARB纹理时,它只包含垃圾,但我没有收到错误消息。
原标题:
  • 时间:2009-03-12 19:14:53
  •  标签:

我生成类似这样的纹理:

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(...)...就是 :)

  1. Have I forgotten to check for errors in a place/way that I haven t thought of?
  2. Do GL_RGBA16F_ARB-textures require any special treatment that I haven t given?
  3. Is there anything else that might be wrong?

我很困惑,因为GL_RGBA16一切都顺利运行... :(

编辑:使用GL_RGBA16F_ARB时,我尝试将第一个帧渲染到屏幕上时失败了。 好像我应该在某个地方得到错误消息..?

通过检查ShadowIce的工作代码示例,我发现如果我在我的FBO上更改深度缓冲区并将glRenderBufferStorageEXT(...)的第二个参数更改为GL_DEPTH_COMPONENT24,而不是GL_DEPTH_COMPONENT16,问题就会消失。我不知道为什么这样会起作用,但显然确实有效。

同样的,如果我在那里进行相反的替换,ShadowIce的代码也会像我的一样出错。

最佳回答

设置浮点纹理的帧缓冲不应该有什么特别的事情要做。一些我会检查的事情:

  1. Is the FBO bound and the draw/read buffer set correctly before you call glCheckFramebufferStatusEXT? Also try testing it right before you draw to it.
  2. Does the texture look ok after a simple glClear with a specific clear color? If yes, there might be something wrong with your shaders (if you use any) or the way you draw to the FBO.
  3. Are your drivers up to date? And does the problem still exist on a PC with different hardware?
  4. How about GL_RGBA32F_ARB?

编辑:

  1. Check the id of your framebuffer and texture, also check if the texture id matches the one attached to your fbo (with glGetFramebufferAttachmentParameteriv). Normally I would guess that everything is ok with that if it works with a RGBA texture but random data (especially purple) is a good sign that nothing was written to the texture or it wasn t cleared properly.

我写了一个小的示例应用程序,应该可以工作,也许有帮助。我只在Windows上测试过它,所以对于Linux,您可能需要稍微更改一下:链接。

问题回答

GL_HALF_FLOAT_ARB可能作为类型而不是GL_FLOAT。





相关问题
热门标签