微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

多重采样帧缓冲区仅在 Nvidia 卡上可见,在 AMD 或 Intel HD Graphics 上不可见

如何解决多重采样帧缓冲区仅在 Nvidia 卡上可见,在 AMD 或 Intel HD Graphics 上不可见

该程序仅使用 Nvidia 显卡渲染帧缓冲区。我用 AMD 和 Intel 测试了相同的版本,它显示为黑色。

我创建了帧缓冲区:

enum FBOIDS
{
    FBO,FBO_MS,TEXTURE,TEXTURE_MS,RBO,RBO_MS
};
unsigned int ID[6];

glGenFramebuffers(1,&ID[FBO_MS]);
glBindFramebuffer(GL_FRAMEBUFFER,ID[FBO_MS]);

// generate texture
glGenTextures(1,&ID[TEXTURE_MS]);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE,ID[TEXTURE_MS]);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE,smaa,GL_RGBA,1,GL_TRUE);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE,0);

// attach it to currently bound framebuffer object
glFramebufferTexture2D(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D_MULTISAMPLE,ID[TEXTURE_MS],0);

glGenRenderbuffers(1,&ID[RBO_MS]);
glBindRenderbuffer(GL_RENDERBUFFER,ID[RBO_MS]);
glrenderbufferStorageMultisample(GL_RENDERBUFFER,GL_DEPTH24_STENCIL8,1);
glBindRenderbuffer(GL_RENDERBUFFER,0);

glFramebufferRenderbuffer(GL_FRAMEBUFFER,GL_DEPTH_STENCIL_ATTACHMENT,GL_RENDERBUFFER,ID[RBO_MS]);

//========================================================================

glGenFramebuffers(1,&ID[FBO]);
glBindFramebuffer(GL_FRAMEBUFFER,ID[FBO]);

// generate texture
glGenTextures(1,&ID[TEXTURE]);
glBindTexture(GL_TEXTURE_2D,ID[TEXTURE]);
glTexImage2D(GL_TEXTURE_2D,GL_RGB8,GL_RGB,GL_UNSIGNED_BYTE,0);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glBindTexture(GL_TEXTURE_2D,0);

glFramebufferTexture2D(GL_FRAMEBUFFER,GL_TEXTURE_2D,ID[TEXTURE],&ID[RBO]);
glBindRenderbuffer(GL_RENDERBUFFER,ID[RBO]);
glrenderbufferStorage(GL_RENDERBUFFER,ID[RBO]);

我是这样画的:

// =========================================
//=== Update tex
glBindFramebuffer(GL_FRAMEBUFFER,ID[FBO_MS]);

glBindTexture(GL_TEXTURE_2D_MULTISAMPLE,size.x,size.y,0);

glBindRenderbuffer(GL_RENDERBUFFER,size.y);
glBindRenderbuffer(GL_RENDERBUFFER,ID[RBO_MS]);

//========================================================================

glBindFramebuffer(GL_FRAMEBUFFER,ID[FBO]);

// generate texture
glBindTexture(GL_TEXTURE_2D,0);
glBindTexture(GL_TEXTURE_2D,ID[RBO]);

glBindFramebuffer(GL_FRAMEBUFFER,ID[FBO_MS]);

glBindFramebuffer(GL_READ_FRAMEBUFFER,ID[FBO_MS]);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER,ID[FBO]);
glBlitFramebuffer(0,GL_COLOR_BUFFER_BIT,GL_NEAREST);

glBindFramebuffer(GL_FRAMEBUFFER,0);

带有图片的 Github 问题链接https://github.com/christt105/Elit3D/issues/40

Program on AMD or Intel HD Graphics Program on Nvidia

解决方法

问题已解决。问题是我设置了更多 GPU 可以承受的样本。我已使用 glGetIntegerv(GL_MAX_SAMPLES,&maxSamples); 获得最大样本数。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。