gpt4 book ai didi

OpenGL - 如何绘制到多采样帧缓冲区,然后将结果用作普通纹理?

转载 作者:行者123 更新时间:2023-12-03 21:28:25 24 4
gpt4 key购买 nike

我正在开发一个小游戏开发库。该库的元素之一是 Canvas(屏幕外绘图区),它是通过 OpenGL 帧缓冲区实现的。到目前为止,一切都很好,我生成了一个纹理,将它附加到帧缓冲区,渲染到它,然后使用帧缓冲区的纹理作为 Texture2D。

现在,我想向我的库中添加抗锯齿功能,因此我希望能够在 Canvas 上设置多重采样。现在我很困惑,因为我发现您需要更改着色器以使用多样本纹理等等。

那么,我应该怎么做才能为我的帧缓冲区启用多重采样,以便我尽量减少对库的其余代码的更改?如果可能,我只想将渲染结果用作常规 Texture2D。

最佳答案

只是为了确保没有混淆。你不能只创建一个 x 倍大的纹理,然后希望过滤器能发挥作用。因为 GL_LINEAR等仅averages the four texels closest to the center of the pixel being textured .

要创建多样本纹理,您可以使用 glTexImage2DMultisample() (从 3.2 开始在核心中可用)。你会这样设置的。

glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, tex);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples, GL_RGBA8, width, height, false);

它应该是不言自明的 samples是多样本纹理中的样本数量。还要更改 internalformat如你所愿。

要将纹理附加到帧缓冲区,您同样可以使用 glFramebufferTexture2D() .但不是设置 textargetGL_TEXTURE_2D你把它设置为 GL_TEXTURE_2D_MULTISAMPLE .
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, tex, 0);

请记住检查帧缓冲区的状态。

在您的着色器中,您还必须使用 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;
}

请注意 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);

归根结底,如果您想显示清晰的抗锯齿结果,则必须将其 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);

如果您需要多样本深度缓冲区,请查看 glRenderbufferStorageMultisample() .

还要确保 glEnable(GL_MULTISAMPLE) .然而,今天大多数驱动程序默认启用它。

最后但并非最不重要的一点是,这里有一些其他与多重采样相关的 Stack Overflow/Exchange 问题,您可能会感兴趣。
  • Filtering
  • texelFetch() vs texture()
  • Multisample Window Buffer
  • 关于OpenGL - 如何绘制到多采样帧缓冲区,然后将结果用作普通纹理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42878216/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com