在OpenGL中使用多个渲染目标时,我遇到使用显式多重采样的问题。
我有4个渲染目标(位置,漫反射+不透明度,法线,高光+指数),这些渲染目标在初始几何体传递期间渲染。
这些都是附加到帧缓冲对象的非多重采样纹理,然后使用glDrawBuffers()设置为渲染目标。这很好用,然后我可以稍后对这些纹理进行采样,以获得照明计算所需的信息。可爱。
我现在想尝试删除我得到的一些别名,所以我开始使用多重采样纹理实现显式MSAA。但是,当我使用多重采样纹理作为渲染目标时,似乎只会绘制第一个渲染目标,其余的仍为空白。
除了更改纹理在着色器中的设置,绑定和读取方式之外,我还没有改变任何其他代码。
使用以下代码将多重采样纹理附加到帧缓冲对象:
for (unsigned int i = 0; i < textureCount; ++i)
{
// Generate texture
GLuint texture;
glGenTextures(1, &texture);
// Bind multisample texture
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, texture);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, msaaSamples, GL_RGBA, width, height, false);
// Set params
glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
// Attach to frame buffer
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D_MULTISAMPLE, texture, 0);
// Unbind
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);
}
还附加了多重采样深度/模板纹理。
glGenTextures(1, &depth);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, depth);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, msaaSamples, GL_DEPTH24_STENCIL8, width, height, false);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D_MULTISAMPLE, depth, 0);
然后绑定帧缓冲区并绘制缓冲区
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
GLuint attachments[4] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3 };
glDrawBuffers(4, attachments);
然后我像往常一样绘制几何体。然而,当用apitrace检查时,很明显只有第一个颜色附件被吸入。当我使用常规(非多重采样纹理)时,情况并非如此。
然而,所有4个绘制缓冲区仍被设置。
答案 0 :(得分:0)
glTexParameterf不能与GL_TEXTURE_2D_MULTISAMPLE一起使用。
除此之外,我会将glTexImage2DMultisample的&#39; fixedsamplelocations&#39; -param设置为true,以保证安全方面的硬件兼容性。
我建议使用像GL_RGBA8这样大小的格式而不是GL_RGBA(不知道你是如何设法获得GL_RGBA32F所列的第一张图片中带有未标注的GL_RGBA枚举......)。