Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL多渲染目标和多采样_C++_Opengl_Multisampling_Deferred Rendering_Msaa - Fatal编程技术网

C++ OpenGL多渲染目标和多采样

C++ OpenGL多渲染目标和多采样,c++,opengl,multisampling,deferred-rendering,msaa,C++,Opengl,Multisampling,Deferred Rendering,Msaa,在OpenGL中使用多个渲染目标时,我在使用显式多重采样时遇到问题 我有4个渲染目标位置、漫反射+不透明度、法线、镜面反射+指数,它们在初始几何体过程中渲染到 这些都是附加到帧缓冲区对象的非多采样纹理,然后使用glDrawBuffers设置为渲染目标。这很好,我可以稍后对这些纹理进行采样,以获得照明计算所需的信息。可爱 我现在想尝试删除一些我得到的别名,所以我开始使用多采样纹理实现显式MSAA。但是,当我使用多采样纹理作为渲染目标时,似乎只有第一个渲染目标被绘制到,其余的仍然为空 除了在着色器中

在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);
}
然后绑定帧缓冲区并设置绘制缓冲区

glBindFramebuffer(GL_FRAMEBUFFER, fbo);
GLuint attachments[4] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3 };
glDrawBuffers(4,  attachments);
然后我像往常一样画几何图形。但是,当使用apitrace进行检查时,很明显,只有第一个颜色附件被引入。当我使用常规的非多采样纹理时,情况并非如此

但是,所有4个绘图缓冲区仍在设置中


glTexParameterf不能与GL_纹理_2D_多采样一起使用

除此之外,我会将glTexImage2DMultisample的“fixedsamplelocations”参数设置为true,以确保硬件兼容性


我建议使用大小合适的格式,如GL_RGBA8,而不是GL_RGBA。我不知道如何使用未大小的GL_RGBA枚举获得第一张图像中列出的GL_RGBA32F…

请发布代码的相关部分。没有这一点是不可能的。添加了相关的代码,还添加了两张图片来突出问题。您是否也有多样本深度/模板附件?同样可疑的是行GLuint附件[2]={GL_COLOR_ATTACHMENT1,GL_COLOR_ATTACHMENT2,GL_COLOR_ATTACHMENT3,GL_COLOR_ATTACHMENT4}。它应该是数组大小4,而不是2,附件计数也应该从0开始。如果将附件[2]更改为附件[4]无法解决此问题,则在绑定帧缓冲区后调用GLCHECKFRAMEBERSTATUS可能有助于诊断此问题。
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
GLuint attachments[4] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3 };
glDrawBuffers(4,  attachments);