5

我在 Gouraud 着色部分注意到这里,它说“具有相邻多边形的 T 形路口有时会导致视觉异常。一般而言,应避免使用 T 形路口”。

看起来T-junction是下图中的三个表面共享边缘,并且点A可能具有不同的法向量,因为它属于不同的表面。

在此处输入图像描述

但是当T-junction发生时会产生什么影响以及如何使用OpenGL来实现呢?我尝试为每个矩形的每个顶点设置不同的法线,并在场景中放一盏灯,但是,在连接点 A 处我没有看到任何奇怪的东西。

这是我的代码:

glColor3f(1.0f, 0.0f, 0.0f);
glBegin(GL_QUADS);
glNormal3f(0, 0,1);
glVertex3f(-5.0f, 5.0f, 0.0f);
glNormal3f(0, 1,1);
glVertex3f(5.0f, 5.0f, 0.0f);
glNormal3f(1, 1,1);
glVertex3f(5.0f, 0.0f, 0.0f);
glNormal3f(0, -1,1);
glVertex3f(-5.0f, 0.0f, 0.0f);
glEnd();

glColor3f(0.0f, 1.0f, 0.0f);
glBegin(GL_QUADS);
glNormal3f(1, 0,1);
glVertex3f(-5.0f, 0.0f, 0.0f);
glNormal3f(1, 2,1);
glVertex3f(0.0f, 0.0f, 0.0f);
glNormal3f(0, 0,1);
glVertex3f(0.0f, -5.0f, 0.0f);
glNormal3f(0, 1, 2);
glVertex3f(-5.0f, -5.0f, 0.0f);
glEnd();

glColor3f(0.0f, 0.0f, 1.0f);
glBegin(GL_QUADS);
glNormal3f(1, 1, 3);
glVertex3f(0.0f, 0.0f, 0.0f);
glNormal3f(0, -2, 5);
glVertex3f(5.0f, 0.0f, 0.0f);
glNormal3f(-1, 1, 1);
glVertex3f(5.0f, -5.0f, 0.0f);
glNormal3f(1, -2, 0);
glVertex3f(0.0f, -5.0f, 0.0f);
glEnd();

点光源在 (0, 0, 10) 以及相机中。我认为下面的结果没有视觉异常。也许法线应该有点特别?

我做错了什么吗?谁能给我一些提示来实现这一点?

在此处输入图像描述

4

2 回答 2

3

T-Junction 对Gouraud 着色不利和一般几何形状不利。

首先要记住,goraud shading 是一种在固定管线时代使用的光插值方法,其中光在顶点上进行插值,使顶点的网格细分(数量和连通性)直接影响着色。拥有 t-junction 会导致最终插值颜色的外观突然不连续(请记住,Gouraud 着色还有其他问题,例如采样不足)。

Gouraud 着色与 Phong 着色不同,直接使用顶点法线,请注意不要将 Phong 着色与 Phong 光照混淆,它们是不同的

请注意,您所展示的案例是一个 t 形接头,但您不会注意到任何阴影问题,因为网格不够细分,并且(似乎)您没有使用任何光线。尝试在具有 t 形接头的球体上进行测试。

关于几何 t-junction 被认为是退化的情况。因为在那个边/多边形处,几何网格失去了一致性,你不再有两条边在它们的末端连接,并且你失去了多边形循环属性(阅读:有向边)。这通常是一个很难解决的问题,解决方案可能是对多边形进行三角剖分,以便现在正确连接 t-juction 边缘。

http://en.wikipedia.org/wiki/Gouraud_shading

于 2014-02-06T17:56:51.190 回答
1

你处理这种情况的次数越多,问题的核心就会变得越清楚。有一个可靠的例子和花一些时间看它,你可能会“啊哈!” 它会点击。

从理论上讲,该问题通常被描述为这样一种情况,即 t-vert 的直接和相邻区域中的像素基于单独的,有时是不同的输入(t-vert 的法线与相邻顶点的法线)进行着色。您可以通过将 t-vert 的法线设置为与相邻顶点的法线非常不同的东西(例如,与它们的平均值非常不同)来夸大问题作为说明。

但在实践中,除了极端情况之外,您通常还要处理顶点之间法线的平滑渐变,因此问题更加微妙。因此,我以不同的方式看待问题:作为示例数据传播问题。这种情况会导致跨样本的插值不会以均匀的方式将样本数据传播到整个表面。在您的示例中,t-vert 光样本输入没有向上传播,仅向左/向右/向下传播。这就是 t 顶点存在问题的原因之一,它们代表了网格网络中的不连续性,从而导致了此类问题。

您可以通过描绘表面上每个法线点的光值,然后思考给定光位置的脸的合成颜色将在您的脑海中形象化它。使用您的示例,但法线渐变更平滑,对于顶面,您会看到一个长的颜色线性插值。但是,对于底部的两个面,您会看到由 t 顶点法线驱动的两个颜色线性插值。根据光照角度,t 顶点法线可以拾取与相邻法线不同的光量。这将把它上面和下面的颜色插值分开,你会看到一个阴影接缝。

为了说明您的示例,我将仅使用一种颜色,调整法线以使它们形成更均匀的相对角度分布(类似于我将在下面放入的集合),然后使用不同的灯光位置查看它(尤其是靠近 t 顶点的)。

top left normal: [-1, 1, 1]
top right normal: [1, 1, 1]
middle left normal: [-1, 0, 1]
t-vert normal: [0, 0, 1]
middle right normal: [1, 0, 1]
bottom left normal: [-1, -1, 1]
bottom middle normal: [0, -1, 1]
bottom right normal: [1, -1, 1]

因为这是一个由采样数据的不均匀传播引起的问题——而传播就是插值的作用——顺便说一下,其他插值技术(如 Phong 着色)也会发生类似的异常。

于 2014-04-11T16:30:57.073 回答