opengl - glTexImage2DMultisample 如何工作?

标签 opengl textures opengl-3 fragment-shader multisampling

我想使用多重采样纹理。

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

还有,哪个API可以用来加载纹素数据?

我想为此使用默认的 FBO。

最佳答案

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

i want to use multisampled textures.

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

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

将其附加到FBO。然后实际的渲染过程是这样的:

您将您的 FBO 与 MS 纹理附件绑定(bind)。渲染您的几何体。然后您通过 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 great site,您可以在其中找到 OpenGL 代码示例,展示许多一般问题(包括您的问题)的解决方案。

What will be the fragment shader and how to pass multiple samplers to shader?

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

Also, which API can be used to load texel data ? Which APIs to be used to apply this texture?

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

关于opengl - glTexImage2DMultisample 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14019910/

相关文章:

opengl - 使用具有多个采样器制服的单个纹理图像单元

c++ - OpenGL + 多摄像头

c++ - 转换相机 OpenGL

javascript - 已记录 WebGL 'texture not renderable' 警告,但所有行为均正确

android - Ice Cream Sandwich 上的 OpenGL 黑色纹理

opengl - 在 OSX Lion 上使用 OpenGL 3.2 与 Derelict3 和 GLFW 3

opengl - TEXTURE_2D_ARRAY 未渲染

opengl - 将模板渲染缓冲区绑定(bind)到opengl中的帧缓冲区

java - libGDX X 和 Y 鼠标输入

opengl - 为什么我们需要透视划分?