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

PixelFormatAttributes:

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的问题。

最佳答案

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

我不知道您要实现的算法的细节,但是如果该纹理包含已经完成的先前的一些计算结果,并且已经完成了多样本采集,那么我真的不确定您是否可以将该结果用于整个片段(以及所有其样本)。 mask 的边缘会褪色,这似乎是问题所在。

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

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

关于opengl - MSAA的抗锯齿问题,使用深度和FBO绘制CSG,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20198855/

10-13 09:53