fai*_*ace 4 opengl multisampling framebuffer antialiasing
我正在开发一个小游戏开发库。该库的元素之一是 Canvas(屏幕外绘图区),它是通过 OpenGL 帧缓冲区实现的。到目前为止,一切都很好,我生成了一个纹理,将它附加到帧缓冲区,渲染到它,然后使用帧缓冲区的纹理作为 Texture2D。
现在,我想向我的库中添加抗锯齿功能,因此我希望能够在 Canvas 上设置多重采样。现在我很困惑,因为我发现您需要更改着色器以使用多样本纹理等等。
那么,我应该怎么做才能为我的帧缓冲区启用多重采样,以便我尽量减少对库的其余代码的更改?如果可能,我只想将渲染结果用作常规 Texture2D。
只是为了确保没有混淆。你不能只创建一个 x 倍大的纹理,然后希望过滤器能发挥作用。因为GL_LINEAR,等只会平均最接近被纹理化像素中心的四个纹素。
要创建您将使用的多采样纹理glTexImage2DMultisample()(自 3.2 起在核心中可用)。你会这样设置的。
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, tex);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples, GL_RGBA8, width, height, false);
Run Code Online (Sandbox Code Playgroud)
它应该是不言自明的,因为samples它是多样本纹理中的样本数量。也可以随意更改internalformat。
要将纹理附加到帧缓冲区,您同样使用glFramebufferTexture2D(). 但不是textarget像GL_TEXTURE_2D您设置的那样设置GL_TEXTURE_2D_MULTISAMPLE。
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, tex, 0);
Run Code Online (Sandbox Code Playgroud)
请记住检查帧缓冲区的状态。
在您的着色器中,您还必须使用sampler2DMS才能访问多重采样纹理。但是请注意,与常规纹理相比,多样本纹理的工作方式大不相同。如果您想从纹理中读取数据,则必须使用texelFetch().
因此,如果您想从多样本纹理中进行采样,那么您不能使用,texture()但必须使用texelFetch()类似的东西。
uniform int texSamples;
uniform sampler2DMS tex;
vec4 textureMultisample(sampler2DMS sampler, ivec2 coord)
{
vec4 color = vec4(0.0);
for (int i = 0; i < texSamples; i++)
color += texelFetch(sampler, coord, i);
color /= float(texSamples);
return color;
}
Run Code Online (Sandbox Code Playgroud)
请注意,texelFetch()不采用标准化坐标,您可以使用以下方法规避此问题:
vec2 uv = vec2(0.5, 0.5); // normalized coordinates
ivec2 texSize = textureSize(tex, 0);
ivec2 texCoord = ivec2(uv * texSize);
vec4 color = textureMultisample(tex, texCoord);
Run Code Online (Sandbox Code Playgroud)
归根结底,如果您想显示清晰的抗锯齿结果,则必须将其 blit 到屏幕上。
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
glDrawBuffer(GL_BACK);
glBlitFramebuffer(0, 0, src_width, src_height, 0, 0, dst_width, dst_height, GL_COLOR_BUFFER_BIT, GL_LINEAR);
Run Code Online (Sandbox Code Playgroud)
如果您需要多样本深度缓冲区,请查看glRenderbufferStorageMultisample().
还要确保glEnable(GL_MULTISAMPLE). 然而,今天大多数驱动程序默认启用它。
最后但并非最不重要的一点是,这里有一些其他与多重采样相关的 Stack Overflow/Exchange 问题,您可能会感兴趣。
| 归档时间: |
|
| 查看次数: |
5861 次 |
| 最近记录: |