【发布时间】:2014-02-04 10:01:43
【问题描述】:
我已经在一些变体中实现了对 MSAA 的支持:
它可以使用基于上下文(通过在设置上下文时调用 wglChoosePixelFormatARB 并将相应的参数列表传递给它)或通过启用 MSAA 渲染到 FBO(创建带有颜色和深度渲染缓冲区附件的多重采样 FBO,以及另一个 FBO带有用于解析的颜色附件),并且抗锯齿似乎总体上起作用。
但是,当我启用抗锯齿时,我发现了一些似乎与镜面光照有关的伪影。这对于基于上下文的 CSAA 来说是最糟糕的,对于基于上下文的 MSAA 来说非常糟糕,但是当我在渲染到我的 FBO 时使用 MSAA 时会好得多。
对于我用于测试的其中一种飞机模型,它非常明显,尤其是在发动机气缸和一些“电线”周围(它们实际上不是线,而是细气缸):
正如您在图片上看到的,当我关闭镜面反射光时,问题几乎消失了,但我不太确定是什么原因造成的。
以上图像使用此着色器代码来计算镜面反射(在所有灯光的循环内):
if( matShininess > 0.0 )
{
vec3 reflectionCamSpace = reflect(-lightDirectionCamSpace, faceNormal);
vec3 surfToViewerCamSpace = normalize (-vertPositionCamSpace);
float dotSpecular = max( 0.0, dot (reflectionCamSpace, surfToViewerCamSpace) );
float specularFactor = pow( dotSpecular, matShininess );
specularTerm += vec3(lgt.specular * specularFactor);
}
另外,不同的光照模型似乎也有很大的不同:
左边使用上面提到的高光代码,而右边使用这个(同样在主光循环中,它遍历所有光)
if( matShininess > 0.0 )
{
vec3 surfToViewerCamSpace = normalize (-vertPositionCamSpace);
vec3 halfAngle = normalize(lightDirectionCamSpace + surfToViewerCamSpace);
float specularFactor = dot(faceNormal, halfAngle);
specularFactor = clamp(specularFactor, 0, 1);
specularFactor = lightDot != 0.0 ? specularFactor : 0.0;
specularFactor = pow(specularFactor, matShininess);
specularTerm += vec3(lgt.specular * specularFactor);
}
所以我想知道为什么在使用基于 FBO 的 MSAA 和基于上下文的 MSAA 时会有如此大的差异。还有,我在镜面高光方面做错了什么,一开始就造成了问题?
编辑:根据下面帖子的要求,我还添加了一个测试,用于通过上下文和 FBO 比较 16xQ CSAA 的结果(对于 FBO,我只是使用 RenderbufferStorageMultisampleCoverageNV 而不是 glRenderbufferStorageMultisample)。同样,FBO 结果似乎更好(但仍不能令人信服):
【问题讨论】:
-
您好,您的图片链接已损坏,您可以修复它们吗?我有兴趣看看:)
-
您好,我只是去寻找我的硬盘上的图像...我记得我之前将它们上传到我的 AWS,但是当我不久前进行一些清理时它们似乎被删除了,我在我的硬盘上也找不到它们了现在正在寻找(抱歉,当我转移到另一个项目时,我似乎抹去了我的大脑记忆哈哈)
-
大声笑,好吧,没关系,我不想让你太无聊 :) 无论如何,如果你能写一些关于你实现的抗锯齿技术的总结,我将不胜感激
-
哦,我确实设法再次找到了那些照片(只是不在我预期的地方,哈哈)......所以我再次上传它们,即应该再次正常工作