【发布时间】:2013-12-10 12:29:28
【问题描述】:
我已经为现代 OpenGL 版本重新实现了 OpenCSG。
像素格式属性:
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。
【问题讨论】:
-
32 位颜色缓冲区 + 8 位 alpha 让我觉得特别不寻常。通常像素格式设置如下: 32 位(未使用 8 位)RGB + 0 A 或 24 位 RGB + 8 位 A,几乎从不 32 位 RGB + 8 位 A(产生 40 位颜色缓冲)。由于 CGL 将匹配最接近的格式,因此应该没有什么区别,但您要求它提供一些根本上奇怪的东西。
-
@AndonM.Coleman 实际上你是对的,会改变的!但这并没有解决我的问题。我找到了几篇关于如何解决类似问题的文章: 1. alphanew.net/index.php?section=articles&site=multisampling 2. mtnphil.wordpress.com/2013/06/26/know-your-ssao-artifacts 但是对我来说很难完全理解,因为我不是母语人士。也许以后会明白。
-
顺便说一下,当您在像素格式中指定
Supersample时,您是在向 GL 询问 SSAA 而不是 MSAA。这是 OS X;我从来没有在 OS X 上遇到过支持超级采样的硬件加速像素格式,只有软件渲染器。我建议您也将其从像素格式中删除。在这一点上,这变得非常挑剔,但是由于现在问题中的唯一信息与您的像素格式有关... :) -
在片段着色器的分支中,如果你写的是
discard而不是gl_FragDepth = 1.0f; gl_FragColor = vec4 (0.0f, 0.0f, 0.0f, 0.0f); return;?我有一种疯狂的预感,但如果没有自己尝试的代码,我能做的最好的事情就是问你它是否改变了任何东西。 -
@AndonM.Coleman 使用该代码,模型变蓝,线条仍然可见,picture。对于 Mac OS X,Supersample 比 Multisample 更理想。我将尝试将其更改为 MSAA 并查看 GL_SAMPLE_ALPHA_TO_COVERAGE。
标签: opengl opengl-3 fragment-shader fbo csg