我注意到这里的洛德着色部分,它说:"与毗邻的多边形,T连接有时可能会导致视觉异常.一般来说,T-结应尽量避免."
看起来T形接头在下面的图片中约三个表面共享边缘,并且点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, …Run Code Online (Sandbox Code Playgroud) 我们有一组三角形。每个三角形都是三个点。每个点都是实数的三元组。我们可以计算每个三角形的表面法线。然而,对于 Gouraud 着色,我们需要顶点法线。因此,我们必须访问每个顶点并查看共享该顶点的三角形,平均它们的表面法线,然后得到顶点法线。
实现这一目标最有效的算法和数据结构是什么?
一个简单的方法是这样的(伪 python 代码):
MAP = dict()
for T in triangles:
for V in T.vertices:
key = hash(V)
if MAP.has(key):
MAP[key].append(T)
else:
MAP[key] = []
MAP[key].append(T)
VNORMALS = dict()
for key in MAP.keys():
VNORMALS[key] = avg([T.surface_normal for T in MAP[key]])
Run Code Online (Sandbox Code Playgroud)
有更有效的方法吗?
据我了解,Gouraud着色计算每个顶点的光颜色并对该颜色进行插值,而Phong着色对每个像素的法线进行插值并根据该插值计算光颜色。
然而,当我尝试以数学方式导出光颜色时,我最终得到了两种方法相同的公式!

(其中n1和n2是两个顶点的法线,t是插值系数,L是光线方向,顶部的平面和虚线表示屏幕和像素。)
两种方法的光颜色推导如下:
古罗:L = t*dot(n1,L) + (1-t)*dot(n2,L)
冯:L = dot(t*n1+(1-t)*n2,L)
结果是一样的。
谁能告诉我我的推导有什么问题吗?
我试图让一个形状因光源而有一些阴影,但我希望形状都是一种颜色.
我的问题是,无论我怎么努力,我似乎都无法在奇异的颜色模型上得到任何阴影.我已将模型简化为单个三角形,以使此示例更清晰:
#include <GL/glut.h>
#include <math.h>
#include <iostream>
#include<map>
#include<vector>
using namespace std;
/* Verticies for simplified demo */
float vertices[][3] = {
{0.1, 0.1, 0.1},
{0.2, 0.8, 0.3},
{0.3, 0.5, 0.5},
{0.8, 0.2, 0.1},
};
const int VERTICES_SIZE = 4;
/* Polygons for simplified demo */
int polygon[][3] = {
{0, 1, 3},
{0, 2, 1},
{0, 3, 2},
{1, 2, 3},
};
const int POLYGON_SIZE = 4;
/* Average point for looking at */
float av_point[3];
/*
* …Run Code Online (Sandbox Code Playgroud)