【问题标题】:Anti-Aliasing issue with MSAA, drawing CSG with depth and FBOMSAA 的抗锯齿问题,用深度和 FBO 绘制 CSG
【发布时间】:2013-12-10 12:29:28
【问题描述】:

我已经为现代 OpenGL 版本重新实现了 OpenCSG

像素格式属性:

NSOpenGLPFAColorSize    , 24 ,
NSOpenGLPFAAlphaSize    , 8  ,
NSOpenGLPFADepthSize    , 32 ,
NSOpenGLPFAStencilSize  , 8  ,
NSOpenGLPFAAccelerated  ,
NSOpenGLPFADoubleBuffer ,
NSOpenGLPFASupersample  ,
NSOpenGLPFASampleBuffers, 1  ,
NSOpenGLPFASamples      , 4  ,

FBO 规格:(尝试使用多重采样渲染到 FBO,但线条变得更加强烈和可见,请看底部的屏幕截图)
- 创建 2 次幂的纹理,GL_RGBA(已尝试 GL_RGBA8 和 GL_RGBA32F)
- GL_DEPTH24_STENCIL8(尝试了GL_DEPTH32_STENCIL8,没有结果)


简单算法Goldfeather:

while (i < depth complexity) {
    take channel for render
       merge layers if no free channel 
    render each layer with stencil func, mask and depth params to channel (FBO)
}
merge layers (taking texture from FBO and render objects again with applying shader below)


在着色器中,我有用于合并的代码(来自 FBO 的结果纹理在渲染顶部重叠以进行测试,在 OpenCSG it's setupProjectiveTexture 中):

     vec2 ndcPos = gl_FragCoord.xy / sizetexture.xy;
     vec4 maskColor = texture2D(maskTexture, ndcPos.xy);
     if (maskColor[channel] < 0.5) {
        discard;
     }

看起来像在 FBO 获得足够清晰的纹理或尺寸不合适之后。

编辑:
这些线只出现在相减网格的重叠处。

编辑 2:
修复了渲染到非 MSAA FBO 并在结果上应用 FXAA。

【问题讨论】:

  • 32 位颜色缓冲区 + 8 位 alpha 让我觉得特别不寻常。通常像素格式设置如下: 32 位(未使用 8 位)RGB + 0 A 或 24 位 RGB + 8 位 A,几乎从不 32 位 RGB + 8 位 A(产生 40 位颜色缓冲)。由于 CGL 将匹配最接近的格式,因此应该没有什么区别,但您要求它提供一些根本上奇怪的东西。
  • @AndonM.Coleman 实际上你是对的,会改变的!但这并没有解决我的问题。我找到了几篇关于如何解决类似问题的文章: 1. alphanew.net/index.php?section=articles&site=multisampling 2. mtnphil.wordpress.com/2013/06/26/know-your-ssao-artifacts 但是对我来说很难完全理解,因为我不是母语人士。也许以后会明白。
  • 顺便说一下,当您在像素格式中指定 Supersample 时,您是在向 GL 询问 SSAA 而不是 MSAA。这是 OS X;我从来没有在 OS X 上遇到过支持超级采样的硬件加速像素格式,只有软件渲染器。我建议您也将其从像素格式中删除。在这一点上,这变得非常挑剔,但是由于现在问题中的唯一信息与您的像素格式有关... :)
  • 在片段着色器的分支中,如果你写的是discard而不是gl_FragDepth = 1.0f; gl_FragColor = vec4 (0.0f, 0.0f, 0.0f, 0.0f); return;?我有一种疯狂的预感,但如果没有自己尝试的代码,我能做的最好的事情就是问你它是否改变了任何东西。
  • @AndonM.Coleman 使用该代码,模型变蓝,线条仍然可见,picture。对于 Mac OS X,Supersample 比 Multisample 更理想。我将尝试将其更改为 MSAA 并查看 GL_SAMPLE_ALPHA_TO_COVERAGE。

标签: opengl opengl-3 fragment-shader fbo csg


【解决方案1】:

不确定我的解释是否正确。您在着色器中从哪种纹理中采样?

我不知道您正在实施的算法的细节,但如果该纹理包含之前已经完成多样本收集的一些计算的结果,我真的不确定您是否可以将该结果用于整个片段(及其所有样本)。蒙版会在边缘褪色,这似乎是这里的问题。

也许您应该“手动”收集样本,例如使用 sampler2DMS 并在着色器中使用 texelFetch 读取单个样本。

另一种解决方案可能是在第一遍中将 gl_SampleMask 设置为全 1,以防止在边界处褪色。

【讨论】:

    猜你喜欢
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    相关资源
    最近更新 更多