Странные квадратные артефакты освещения в OpenGL

У меня есть программа, которая генерирует карту высоты, а затем отображает ее в виде сетки с помощью 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);
} 

7
задан sigill 13 June 2012 в 16:41
поделиться