glTexImage2DMultisample 是如何工作的?

deb*_*air 2 opengl textures multisampling fragment-shader opengl-3

我想使用多重采样纹理。

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

另外,哪个 API 可用于加载 texel 数据?

我想为此使用默认的 FBO。

Mic*_* IV 5

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

我想使用多重采样纹理。

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

glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA, FRAMEBUFFER_SIZE.x, FRAMEBUFFER_SIZE.y, GL_TRUE);
Run Code Online (Sandbox Code Playgroud)

将其附加到 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);
Run Code Online (Sandbox Code Playgroud)

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

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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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