首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL/GLSL变化向量:如何避免顶点周围的星暴?

OpenGL/GLSL变化向量:如何避免顶点周围的星暴?
EN

Stack Overflow用户
提问于 2012-01-01 05:16:34
回答 2查看 1.3K关注 0票数 1

在OpenGL 2.1中,我将一个位置和法线向量传递给顶点着色器。然后,顶点着色器将varying设置为法线向量,因此在理论上它会线性插值每个三角形的法线。(我认为这是Phong着色的基础。)

在片段着色器中,我使用带有Lambert定律的法线来计算漫反射。除了顶点之间的插值看起来很滑稽之外,它的工作方式与预期相同。具体地说,我看到了一种星暴效应,在顶点之间的边缘上有明显的“热点”。

下面是一个示例,不是来自我自己的渲染,而是演示了完全相同的效果(请参阅页面下方的金色球体):http://pages.cpsc.ucalgary.ca/~slongay/pmwiki-2.2.1/pmwiki.php?n=CPSC453W11.Lab12

Wikipedia says这是高罗着色的一个问题。但据我所知,通过对法线进行插值并按片段运行光照计算,我使用的是Phong模型,而不是Gouraud。是那么回事吗?

如果我使用更精细的网格,我假设这些星暴将不会那么明显。但是添加更多的三角形是解决这个问题的唯一方法吗?我认为有一种方法可以在没有星暴效应的情况下获得平滑的插值。(我肯定在其他地方的粗糙网格上看到过完美平滑的着色,例如在3d Studio Max中。但也许他们正在做一些比插值法线更复杂的事情。)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-01 05:25:25

这并不是完全相同的效果。你看到的是两件事中的一件。

  1. 在片段着色器中使用法线之前未对法线进行规格化的结果。
  2. 通过三角形边的线性渐变碰撞创建的光学错觉。真的。

"Gradient Matters" section at the bottom of this page (注意:为了充分披露,这是我的教程)详细解释了这一现象。使用插值法线的简单Lambert漫反射有效地在三角形上创建或多或少的线性灯光。具有不同法线集的三角形将具有不同的渐变。它将是C0连续的(沿边缘的颜色相同),但不是C1连续的(沿两个渐变的颜色以不同的速率变化)。

人类的视觉能够捕捉到像这样的梯度差异,并使它们脱颖而出。因此,我们认为它们是硬边缘,而实际上它们不是。

这里唯一真正的解决方案是进一步细分网格,或者使用从网格的更精细版本创建的法线贴图,而不是插值法线。

票数 6
EN

Stack Overflow用户

发布于 2012-01-01 05:21:44

您不会显示代码,因此无法判断,但最有可能的问题是片段着色器中的未规范化法线。在顶点着色器中计算的法线是插值的,这会导致向量不是单位长度-因此在计算片段照明之前,需要在片段着色器中重新规格化它们。

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

https://stackoverflow.com/questions/8690605

复制
相关文章

相似问题

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