GPU 手动 Mipmap 生成 [OpenGL 2.x]
我想使用特定的自定义算法来为某些可渲染纹理(R16F 和 RGBA16F)生成 mipmap。
所有需要的纹理的 mipmap 都通过使用 glGenerateMipmapEXT() 预先启用。
到目前为止最大的问题是渲染成 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]
i want use a specific customized algorithm to generate mipmaps for some renderable textures (R16F & RGBA16F).
All needed textures' mipmaps are pre-enabled by using glGenerateMipmapEXT().
The biggest problem so far is to render into 1+ mipmap levels.
More precisely,
this works like a charm:
...
glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, target, texType, texId, 0 );
checkFBOStatus();
...
render();
But this gives me a GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT when checking fbo status
...
glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, target, texType, texId, 1 );
checkFBOStatus();
...
render();
All the difference in code is the lod level parameter for attaching a texture onto the FBO.
after lots of feverish head-scratching, i still cant get it work.
So, any answer is greatly appreciated.
[NOTE: target platform is OpenGL 2.x with FBO extension]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
问题已解决
FBO 不完整的原因是由于纹理一致性。
当使用glGenerateMipmapEXT/glGenerateMipmap时,你必须确保你的纹理的基础级别包含有效数据;否则,该调用将失败且不会发出任何错误通知。
有两种可能的解决方案供您参考:
使用TexImage或TexSubImage
填充您的可渲染纹理
在glGenerateMipmap
之前
将可渲染纹理附加到
glGenerateMipmap 之前的虚拟 FBO
两种方式都有效(在 GF8、GF9 上测试)
未在 ATI 卡上进行测试。
如果有人可以在 ATI GPU 上进行测试,那就太好了。
PS。如果您在使用这些解决方案时遇到问题,请告诉我。
Problem SOLVED
The reason of FBO incomplete is due to texture consistence.
When using glGenerateMipmapEXT/glGenerateMipmap, u must make sure your texture's base level contains VALID DATA; otherwise, that call fails without any error notification.
There're two possible solutions for your referrence:
Use TexImage or TexSubImage to
fillup your renderable texture
before glGenerateMipmap
Attach the renderable texture to a
dummy FBO before glGenerateMipmap
Either way works (tested on GF8,GF9)
Not tested on ATI cards.
That'd be great if anyone can test it out on ATI GPUs.
PS. Pls let me know if u have problem using these solutions.
哇,我在 ATI Radeon 9800 上也遇到同样的问题。
但我用 gltexImage2D 进行了调用。
可以渲染到第一级,但不能渲染到其他级别。也许我应该尝试虚拟 FBO 方法。
Wow, I'm having the same problem on ATI Radeon 9800.
But I made a call with gltexImage2D.
Render to the first level is possible but not the others. Maybe I should try the dummy FBO method.