У меня есть программа, которая генерирует карту высот, а затем отображает ее как сетку с OpenGL. Когда я пытаюсь добавить освещение, он заканчивается странными квадратными фигурами, покрывающими сетку. Они более заметны в некоторых областях, чем другие, но всегда там.Странные квадратные артефакты освещения в OpenGL
Я использовал квадратную сетку, но после переключения на треугольную сетку ничего не изменилось. Я использовал по крайней мере три разных метода для вычисления нормалей вершин, все с одинаковым эффектом. Я делал освещение вручную с помощью шейдеров, но при использовании встроенной системы освещения OpenGL ничего не меняется.
Мой последний нормальный генерирующий код (лица представляет собой массив индексов в 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]);
}
Хотя это не единственный код, который я использовал, так что я сомневаюсь, что это является причиной проблемы.
Я рисую сетку с:
И я в настоящее время не используется никаких шейдеров.
Что может быть причиной этого?
EDIT: Более полный набор скриншотов:
Для последнего, код шейдера
Vertex:
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);
}
Не могли бы вы разместить два скриншота одной и той же сцены, один с каркасом и один без? –
Является ли 'norm' нулевой инициализацией? Вы накапливаете свои векторы в него, не обнуляя его сначала, хотя, если он обнуляется в другом месте программы, это не должно быть проблемой. – genpfault
Вы используете гладкую интерполяцию для обычных атрибутов в шейдере? Возможно, переход на «плоский» для бит может помочь локализовать проблему. Кроме того, освещение OpenGL имеет тенденцию быть очень затруднительным для меня - я обычно более уверен в коде, который я написал сам. –