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