7

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

PixelFormat属性:

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 中它是 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。

4

1 回答 1

0

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

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

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

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

于 2015-01-28T13:56:06.453 回答