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
Opengl glTexImage2DMultisample是如何工作的?_Opengl_Textures_Opengl 3_Fragment Shader_Multisampling - Fatal编程技术网

Opengl glTexImage2DMultisample是如何工作的?

Opengl glTexImage2DMultisample是如何工作的?,opengl,textures,opengl-3,fragment-shader,multisampling,Opengl,Textures,Opengl 3,Fragment Shader,Multisampling,我想使用多采样纹理 片段着色器是什么,以及如何将多个采样器传递到着色器 另外,哪种API可用于加载texel数据 我想用默认的FBO来回答这个问题。你的主题仍然很广泛,很难在这里给出一个深刻的答案。事实上,你在这里问了3个不那么琐碎的问题,你应该阅读相关的文献。而对你来说,最好的办法是从这本书开始,也许还可以获得这本书。 我的回答假设您使用的是现代(可编程)OpenGL: 我想使用多采样纹理 假设您在使用自己的帧缓冲区使用默认帧缓冲区时需要它,则不需要多重采样,因为它是自动为您完成的。您只需在创

我想使用多采样纹理

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

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


我想用默认的FBO来回答这个问题。

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

我想使用多采样纹理

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

glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA, FRAMEBUFFER_SIZE.x, FRAMEBUFFER_SIZE.y, GL_TRUE);
将其连接到FBO。然后实际渲染过程如下所示:

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();
}
您可以使用MS纹理附件绑定FBO。渲染几何体。然后,您可以解析多采样纹理,或将其分解为常规纹理,或通过闪烁直接分解为默认backbuffer:

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();
}
顺便说一句,这些代码片段取自您可以找到OpenGL代码示例的地方,该示例展示了许多常见问题(包括您的问题)的解决方案

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

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

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


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

您太笼统了,请将问题具体化,并对问题进行详细解释。@MichaelIV编辑的问题如果我想在不使用非默认FBO的情况下使用glTexImage2DMultisample,它会是多余的吗?在这种情况下,如果你还想实现一个自定义采样算法,它就有意义了。否则,它是毫无意义的,因为硬件默认为你做的。在OpenGL superbible 5中有一章显示了第一个选项。建议你看一看:)我检查了Ogl样本工具包,但似乎唯一缺少的是多采样纹理。您提到的文件是用于多采样FBO的,而不是用于纹理。这实际上是多采样。可能您对“多采样纹理”的理解有所不同?