GPU手动Mipmap生成[OpenGL 2.x]

时间:2010-02-15 13:45:03

标签: opengl gpu shader mipmaps

我想使用特定的自定义算法为某些可渲染纹理(R16F和RGBA16F)生成mipmap。

使用glGenerateMipmapEXT()预先启用所有需要纹理的mipmap。

到目前为止,最大的问题是渲染到1+ mipmap级别。 更确切地说, 这就像一个魅力:

...
glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, target, texType, texId, 0 );
checkFBOStatus();
...
render();

但在检查fbo状态时,这会给我一个GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT

...
glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, target, texType, texId, 1 );
checkFBOStatus();
...
render();

代码中的所有差异都是将纹理附加到FBO上的lod级别参数。

经过大量头晕目眩之后,我仍然无法正常工作。 所以,非常感谢任何答案。

[注意:目标平台是带有FBO扩展名的OpenGL 2.x]

2 个答案:

答案 0 :(得分:2)

问题已解决


FBO不完整的原因是由于纹理一致性。 使用glGenerateMipmapEXT / glGenerateMipmap时,你必须确保纹理的基本级别包含有效数据;否则,该呼叫失败,没有任何错误通知。

您的推荐有两种可能的解决方案:

  1. 使用TexImage或TexSubImage 填充你的可渲染纹理 在glGenerateMipmap之前

  2. 将可渲染纹理附加到a glGenerateMipmap之前的虚拟FBO

  3. 无论哪种方式都有效(在GF8,GF9上测试) 未在ATI卡上测试过。

    如果有人可以在ATI GPU上测试它,那就太好了。

    PS。如果您在使用这些解决方案时遇到问题,请告诉我。

答案 1 :(得分:0)

哇,我在ATI Radeon 9800上遇到了同样的问题。 但我跟gltexImage2D打过电话。

可以渲染到第一级但不能渲染到其他级别。也许我应该尝试虚拟FBO方法。