2013-11-25 62 views
7

我已经为现代OpenGL版本重新实现了OpenCSGMSAA的反锯齿问题,绘制深度和FBO的CSG

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固定。

+0

32位色彩缓冲区+ 8位阿尔法让我特别不寻常。通常像素格式设置如下:32位(8位未使用)RGB + 0 A或24位RGB + 8位A,几乎从不32位RGB + 8位A(产生40位颜色缓冲)。它应该没有什么不同,因为CGL会匹配最接近的格式,但是你要求它有些奇怪的东西。 –

+0

@ AndonM.Coleman其实你是对的,会改变!但它没有解决我的问题。我发现了几篇关于如何解决类似问题的文章: 1. http://www.alphanew.net/index.php?section=articles&site=multisampling 2. http://mtnphil.wordpress.com/2013/06/ 26/know-your-ssao-artifacts/ 但对我来说很难完全理解,因为我不是母语的人。也许以后会明白。 – SAKrisT

+0

顺便说一句,当你以你的像素格式指定'Supersample'时,你要求GL取代SSAA而不是MSAA。这是OS X;我在OS X上从未遇到过支持超采样的硬件加速像素格式,只有软件渲染器。我建议你从像素格式中删除它。在这一点上,这变得相当挑剔,但由于现在问题中唯一的信息与像素格式有关...... :) –

回答

0

不知道我把你的解释说得对。你在着色器中采样哪种纹理?

我不知道你正在实现的算法的细节,但如果该纹理包含一些以前的计算结果与多样本收集已经完成,我真的不知道你可以使用整个片段的结果(及其所有样本)。面具将在边缘褪色,这似乎是这里的问题。

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

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