MSAA的抗锯齿问题,深度绘制CSG和FBO

时间:2013-11-25 17:01:26

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

我为现代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;
     }

enter image description here

看起来FBO后纹理不够清晰或尺寸不合适。

编辑:
这些线条仅出现在减去网格的重叠位置。

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

1 个答案:

答案 0 :(得分:0)

不确定我的解释是否正确。你在着色器中采样了什么样的纹理?

我不知道您正在实现的算法的具体细节,但如果该纹理包含已经完成多重采样采集的一些先前计算的结果,我真的不确定您是否可以将该结果用于整个片段(和所有的样品)。面具会在边缘褪色,这似乎是问题所在。

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

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