【发布时间】:2012-06-13 06:59:57
【问题描述】:
我有一个程序可以生成高度图,然后使用 OpenGL 将其显示为网格。当我尝试添加照明时,最终会出现奇怪的方形覆盖网格。它们在某些区域比其他区域更明显,但始终存在。
我使用的是四边形网格,但切换到三角形网格后没有任何变化。我已经使用了至少三种不同的方法来计算顶点法线,都具有相同的效果。我正在使用着色器手动进行照明,但使用内置时没有任何变化 OpenGL 光照系统。
我最新的法线生成代码(faces 是一个指向顶点的索引数组,即顶点数组):
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();
}
片段:
varying vec3 lightvec, normal;
void main(void) {
float l = dot(lightvec, normal);
gl_FragColor = vec4(l, l, l, 1);
}
【问题讨论】:
-
你能贴两张同一个场景的截图,一张有线框,一张没有?
-
norms是零初始化的吗?您在没有先将其归零的情况下将向量累积到其中,但如果它在程序中的其他地方归零,这应该不是问题。 -
您是否对着色器中的普通属性使用平滑插值?也许切换到
flat可以帮助定位问题。此外,OpenGL 照明对我来说往往是非常错误的 - 我通常更确定我自己编写的代码。 -
@genpfault:初始化时归零