glTexImage2DMultisample如何工作?

时间:2012-12-24 10:12:06

标签: opengl textures opengl-3 fragment-shader multisampling

我想使用多重采样纹理。

片段着色器是什么以及如何将多个采样器传递给着色器?

此外,哪些API可用于加载纹素数据?

我想为此使用默认FBO。

1 个答案:

答案 0 :(得分:4)

你的话题仍然很广泛,这里很难给出一个深刻的答案。事实上,你在这里问3个不那么琐碎的问题,你应该阅读相关的文献。对你来说最好的是从{开始{3}}并且可能还会获得here本书。 我的答案假设您正在使用现代(可编程)OpenGL:

  

我想使用多重采样纹理。

假设在使用自己的帧缓冲区使用默认帧缓冲区时需要它,您不需要进行多重采样,因为它是自动完成的。您需要在创建OpenGL上下文时定义一些样本({{3例如,lib)。 因此,如果您有一个自定义帧缓冲对象(FBO)并想要对纹理进行多重采样以消除别名边缘,则应创建一个多重采样纹理对象:

glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA, FRAMEBUFFER_SIZE.x, FRAMEBUFFER_SIZE.y, GL_TRUE);

将它附加到FBO。然后实际的渲染过程如下:

将FBO绑定到MS纹理附件。修改几何体。然后通过blitting重新分析多重采样纹理或常规纹理或直接进入默认后备缓冲区:

glBlitFramebuffer(
    0, 0, FRAMEBUFFER_SIZE.x, FRAMEBUFFER_SIZE.y, 
    0, 0, FRAMEBUFFER_SIZE.x, FRAMEBUFFER_SIZE.y, 
    GL_COLOR_BUFFER_BIT, GL_NEAREST);

整个渲染过程应该是这样的:

void display()
{
glProgramUniform1i(ProgramName, UniformDiffuse, 0);

// Clear the framebuffer
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glClearBufferfv(GL_COLOR, 0, &glm::vec4(1.0f, 0.5f, 0.0f, 1.0f)[0]);

glUseProgram(ProgramName);

// Pass 1
// Render the scene in a multisampled framebuffer
glEnable(GL_MULTISAMPLE);
renderFBO(ProgramName, FramebufferRenderName);
glDisable(GL_MULTISAMPLE);

// Resolved multisampling
glBindFramebuffer(GL_READ_FRAMEBUFFER, FramebufferRenderName);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBlitFramebuffer(
    0, 0, FRAMEBUFFER_SIZE.x, FRAMEBUFFER_SIZE.y, 
    0, 0, FRAMEBUFFER_SIZE.x, FRAMEBUFFER_SIZE.y, 
    GL_COLOR_BUFFER_BIT, GL_NEAREST);





swapBuffers();
}

顺便说一下,这些代码片段取自this,您可以在其中找到OpenGL代码示例,展示解决许多常见问题(包括您的问题)的解决方案。

  

片段着色器是什么以及如何将多个采样器传递给   着色器?

从上述网站下载示例,并查看 ogl-330-fbo-multisample.cpp 和随附的片段着色器。

  

此外,哪些API可用于加载纹素数据?要使用哪些API   应用这个纹理?

您可以使用GLFW轻松加载TGA纹理。如果您想加载任何可能的图像格式,请查看GLFW