首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CSAA/MSAA和镜面灯

CSAA/MSAA和镜面灯
EN

Stack Overflow用户
提问于 2014-02-04 10:01:43
回答 1查看 691关注 0票数 1

我以一些不同的方式实施了对管理事务评估的支持:

它可以使用基于上下文的(在设置上下文时调用wglChoosePixelFormatARB并向其传递相应的参数列表),或者启用MSAA呈现到FBO (创建一个带有颜色和深度呈现缓冲区附件的多采样FBO,以及另一个带有用于解决问题的颜色附件的FBO ),而且抗混叠似乎在总体上是有效的。

然而,我发现一些手工艺品,似乎与镜面照明有关,当我启用反混叠。对于基于上下文的CSAA来说,这是最糟糕的,对于基于上下文的MSAA来说也很糟糕,但是当我将MSAA呈现给我的FBO时,情况要好得多。

对于我用来测试的一种飞机模型,它是非常引人注目的,尤其是在发动机汽缸和一些“电线”周围(它们实际上不是直线,而是细长的圆柱):

正如你在图片上看到的,当我关掉镜面灯时,问题就消失了,但我不太清楚是什么原因造成的。

上面的图像使用这个着色器代码来计算镜面反射(对于所有的灯都在一个循环内):

代码语言:javascript
复制
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); 
}

另外,不同的照明模式似乎也有很大的不同:

左侧使用上述代码进行镜面高光,而右侧则使用此代码(同样在主光循环中,该循环遍历所有的灯)。

代码语言:javascript
复制
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比较16xQCSAA的结果(对于FBO,我只是使用RenderbufferStorageMultisampleCoverageNV而不是glRenderbufferStorageMultisample)。同样,FBO的结果似乎更好(但仍然不能令人信服):

EN

回答 1

Stack Overflow用户

发布于 2014-02-04 18:27:36

这不是一个回答,更像是一个冗长的评论请求。

样本遮阳可能会有所帮助,您可以告诉GL对着色器进行多次评估,而不是每段计算一次,并在覆盖范围允许的情况下将结果传递给所有示例。使用MSAA,着色器只对原语完全覆盖像素的片段进行一次计算。深度/模板样本是唯一的每个样本,这有助于边缘混叠,但任何混叠发生在阴影本身(例如纹理混叠,镜面高光,等等)。没有使用纯MSAA进行校正。

样本阴影有效地将MSAA转换为MSAA (多个样本可能被遮荫一次)到SSAA (1:1样本:阴影比)。我不能说,为什么您的问题只出现在使用默认框架缓冲区执行的MSAA解决方案中。但是样本遮阳应该会有帮助。

至于CSAA,这完全超出了未扩展GL所能控制的范围。在香草GL管道的任何地方都没有CSAA的概念。但是,如果使用NV的NV_framebuffer_multisample_coverage扩展,则可以使用FBO实现它。

老实说,这些天我几乎总是倾向于基于FBO的反混叠。如果这样做,您不需要为最终用户重新创建呈现上下文来更改AA设置,这意味着如果用户开始尝试性能/图像质量的配置设置,那么重新加载资源就会少得多。这是一个更灵活的设计,您甚至可以使用FBO对现代硬件进行MSAA延迟着色,这要归功于多样本纹理获取(您可以在着色器级别实现解析)。

我很想知道您是否经历过基于上下文的CSAA和基于FBO的CSAA之间的任何差异,或者显式设置最少的阴影样本是否有任何影响。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21549212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档