opengl - 在 gouraud shading 中,什么是 T 型连接问题以及如何使用 OpenGL 进行演示

标签 opengl graphics shader gouraud

我注意到 here在 Gouraud Shading 部分,它说“具有相邻多边形的 T-Junction 有时会导致视觉异常。一般来说,应该避免 T-Junction”。

下图中的 T 形接头似乎是共享边的三个表面,并且 A 点可能具有不同的法向量,因为它属于不同的表面。

enter image description here

但是T型接头发生时的效果如何,如何使用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) 以及相机中。我认为下面的结果没有视觉异常。也许法线应该有点特殊?

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

enter image description here

最佳答案

T 形接头对 Gouraud shading 不利和一般的几何学。

首先记住 goraud shading,是一种在固定管道时代使用的光插值方法,其中光在顶点之间进行插值,使顶点的网格分割(数量和连接性)直接影响着色。使用 T 形连接会使最终插值颜色的外观突然不连续(请记住,Gouraud 着色还有其他问题,例如欠采样)。

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

请注意,您呈现的情况是 T 形接头,但您不会注意到任何着色问题,因为网格不够分割,并且(似乎)您没有使用任何光线。尝试在带有 T 形接头的球体上进行测试。

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

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

关于opengl - 在 gouraud shading 中,什么是 T 型连接问题以及如何使用 OpenGL 进行演示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21593786/

相关文章:

python - Pyglet vertex_list_indexed 异常

javascript - 如何在 Javascript 中更新实时图表

c++ - 一些着色器代码中的环境光照

opengl - 是否有可能使用 OpenGL 着色器获得这个 "chroma-shift"效果

java - LWJGL glTranslate 做奇怪的事情

c++ - 我什么时候可以发布源 PBO?

c++ - OpenGL - 一个简单的程序

java - 如何打造专业定制的Java Swing Gui?

c++ - SFML - 窗口调整大小后的中心 View

c++ - OpenGL 着色器不编译