我有一个程序可以生成高度图并使用OpenGL显示为网格。当我试图添加光照时,会出现奇怪的方形覆盖在网格上。它们在某些区域比其他地方更明显,但总是存在的。
我曾经使用四边形网格,但在切换到三角网格后仍然没有变化。我使用了至少三种不同的方法来计算顶点法线,但都产生了相同的效果。我以前是手动使用着色器进行光照,但使用OpenGL内置的光照系统时也没有任何变化。
以下是我的最新法线生成代码(faces是索引数组,指向顶点数组verts):
我曾经使用四边形网格,但在切换到三角网格后仍然没有变化。我使用了至少三种不同的方法来计算顶点法线,但都产生了相同的效果。我以前是手动使用着色器进行光照,但使用OpenGL内置的光照系统时也没有任何变化。
以下是我的最新法线生成代码(faces是索引数组,指向顶点数组verts):
int i;
for (i = 0; i < NINDEX; i += 3) {
vec v[3];
v[0] = verts[faces[i + 0]];
v[1] = verts[faces[i + 1]];
v[2] = verts[faces[i + 2]];
vec v1 = vec_sub(v[1], v[0]);
vec v2 = vec_sub(v[2], v[0]);
vec n = vec_norm(vec_cross(v2, v1));
norms[faces[i + 0]] = vec_add(norms[faces[i + 0]], n);
norms[faces[i + 1]] = vec_add(norms[faces[i + 1]], n);
norms[faces[i + 2]] = vec_add(norms[faces[i + 2]], n);
}
for (i = 0; i < NVERTS; i++) {
norms[i] = vec_norm(norms[i]);
}
虽然这不是我使用的唯一代码,所以我怀疑它并不是问题的原因。
我使用以下代码绘制网格:
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, verts);
glEnableClientState(GL_NORMAL_ARRAY);
glNormalPointer(GL_FLOAT, 0, norms);
glDrawElements(GL_TRIANGLES, NINDEX, GL_UNSIGNED_SHORT, faces);
我当前没有使用任何着色器。
可能是什么原因导致了这个问题?
编辑:更全面的截图如下:
对于最后一张图,着色器代码为:
顶点着色器:
varying vec3 lightvec, normal;
void main() {
vec3 lightpos = vec3(0, 0, 100);
vec3 v = vec3(gl_ModelViewMatrix * gl_Vertex);
normal = gl_NormalMatrix * gl_Normal;
lightvec = normalize(lightpos - v);
gl_Position = ftransform();
}
Fragment:
varying vec3 lightvec, normal;
void main(void) {
float l = dot(lightvec, normal);
gl_FragColor = vec4(l, l, l, 1);
}
norms
是否被初始化为零?在将向量累加到norms
中之前,您没有先将其清零,但如果程序的其他地方已经将其清零,则不应该有问题。 - genpfault