Bir yükseklik haritası oluşturan ve daha sonra OpenGL ile bir ağ olarak görüntüleyen bir programım var. Aydınlatma eklemeye çalıştığımda, örgüyi örten garip kare şekillerle sonuçlanır. Bazı bölgelerde diğerlerinden daha dikkat çekicidirler, fakat her zaman oradadırlar.Garip kare aydınlatma eserleri OpenGL
Dörtlü bir ağ kullanıyordum, ancak bir üçgen ağa geçtikten sonra hiçbir şey değişmedi. Hepsi aynı etkiyle, köşe normallerini hesaplamak için en az üç farklı yöntem kullandım. Işığı el ile gölgelendiricilerle yapıyordum, ancak OpenGL aydınlatma sistemini kullanırken hiçbir şey değişmiyor. ben kullandım sadece kod olmasa da
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]);
}
, bu yüzden de şüphe:
Benim son Normal üreten kodu (bakan bir verts içine endekslerinin dizisi, köşe dizidir) problemin sebebidir.
Beraber örgü çizmek:
Ve şu anda herhangi bir gölgelendiricileri kullanmıyorum.
Buna neden olabilir?
DÜZENLEME: ekran görüntüleri daha kapsamlı kümesi: sonuncusu için
shader kodu
olduğunuVertex:
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);
}
Aynı sahnenin iki ekran görüntüsünü, biri tel çerçeveli ve diğeri olmadan kaydeder misiniz? –
"Norms" sıfır başlatıldı mı? İlk önce sıfırlamadan vektörlerinizin içine biriktiriyorsunuz, ancak programda başka bir yerde sorun çıkmaması durumunda. – genpfault
, gölgelendiricide normal öznitelikler için düzgün enterpolasyon kullanıyor musunuz? Belki biraz 'düz' için geçiş, sorunun yerelleştirilmesine yardımcı olabilir. Ayrıca, OpenGL aydınlatma benim için çok yorucu olma eğilimindedir - genellikle kendim yazdığım koddan daha eminim. –