Mam program, który generuje mapę wysokości, a następnie wyświetla ją jako siatkę w OpenGL. Kiedy próbuję dodać oświetlenie, kończy się dziwacznymi kwadratowymi kształtami pokrywającymi siatkę. Są bardziej widoczne w niektórych obszarach niż inne, ale zawsze tam są.Dziwne kwadratowe artefakty oświetleniowe w OpenGL
Używam siatki quad, ale nic się nie zmieniło po przełączeniu do siatki trójkątów. Użyłem co najmniej trzech różnych metod do obliczenia normali vertex, wszystkie z tym samym efektem. Robiłem oświetlenie ręcznie za pomocą shaderów, ale nic się nie zmienia podczas korzystania z wbudowanego systemu oświetlenia OpenGL .
Mój najnowszy kod generujący normalny (skierowana jest tablicą wskaźników do Verts tablica wierzchołków):
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]);
}
Mimo, że nie jest to tylko kod użyłem, więc wątpię, że to jest przyczyną problemu.
rysuję siatkę z:
I nie obecnie używam żadnych shaderów.
Co może być przyczyną?
EDIT: Bardziej wszechstronny zestaw screenów:
Na ostatnim, kod shaderów jest
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();
}
Fragment:
varying vec3 lightvec, normal;
void main(void) {
float l = dot(lightvec, normal);
gl_FragColor = vec4(l, l, l, 1);
}
Czy możesz umieścić dwa zrzuty ekranu tej samej sceny, jedną z karkasem, a drugą bez? –
Czy "norms' zero-initialized? Gromadzisz wektory do niego bez uprzedniego zerowania, ale jeśli jest wyzerowany w innym miejscu programu, nie powinno to stanowić problemu. – genpfault
Czy używasz płynnej interpolacji dla normalnych atrybutów w module cieniującym? Być może przejście na 'flat' może trochę pomóc w zlokalizowaniu problemu. Ponadto, oświetlenie OpenGL jest dla mnie bardzo niebezpieczne - zazwyczaj jestem bardziej pewny, że sam napisałem kod. –