Açık konum tanımını tercih etmek için iyi bir neden biliyorum .
Geometri verilerinizi Vertex Array Objects içinde tuttuğunuzu düşünün . Belirli bir nesne için, endekslerin karşılık geleceği şekilde bir VAO oluşturursunuz, örneğin:
- dizin 0 : pozisyonlar,
- dizin 1 : normaller,
- dizin 2 : texcoords
Şimdi iki farklı gölgelendiriciyle bir nesne çizmek istediğinizi düşünün . Bir gölgelendirici, girdi olarak konum ve normal verileri gerektirir ; diğerini - konumlar ve doku koordinatları .
Bu gölgelendiricileri derlerseniz, ilk gölgelendiricinin konumları öznitelik endeksi 0'da ve normalleri 1'de bekleyeceğini fark edeceksiniz. Diğeri konumları 0'da ancak doku koordinatları 1'de bekler.
Alıntı https://www.opengl.org/wiki/Vertex_Shader :
Otomatik Atama
Önceki iki yöntemden hiçbiri bir öznitelik indeksine bir girdi atamazsa, o zaman dizin, program bağlandığında OpenGL tarafından otomatik olarak atanır. Atanan dizin tamamen rastgeledir ve aynı köşe gölgelendirici kodunu kullansalar bile bağlantılı farklı programlar için farklı olabilir.
Bu , VAO'nuzu her iki gölgelendiriciyle de kullanamayacağınız anlamına gelir . Örneğin nesne başına bir VAO'ya sahip olmak yerine, en kötü durumda her gölgelendirici için nesne başına ayrı bir VAO'ya ihtiyacınız olacaktır .
Gölgelendiricileri kendi öznitelik numaralandırma kuralınızı kullanmaya zorlamak, glBindAttribLocation
bu sorunu kolayca çözebilir - yapmanız gereken tek şey, öznitelikler ve sabitlenmiş kimlikleri arasında tutarlı bir ilişki sürdürmek ve gölgelendiricileri bağlantı sırasında bu kuralı kullanmaya zorlamaktır.
(Ayrı VAO'lar kullanmıyorsanız bu gerçekten büyük bir sorun değil, ancak yine de kodunuzu daha net hale getirebilir.)
BTW:
Bir OpenGL gölgelendirici programı için öznitelik konumlarını ayarlarken iki seçenekle karşılaşırsınız
OpenGL / GLSL 3.3'te üçüncü bir seçenek vardır: Konumu doğrudan gölgelendirici kodunda belirtin . Şöyle görünüyor:
layout(location=0) in vec4 position;
Ancak bu, GLSL ES gölgelendirici dilinde mevcut değildir.
glBindAttribLocation
Linux üzerinde iyi çalışan grafik motorumda kullanmakla uğraşmadım . Pencerelere taşındığımda, normallerimi köşe noktaları olarak kullanıyordu -glBindAttribLocation
çalışması için gölgelendiricimdeki değişkenlerin sırasını açıkça söylemem gerekiyordu ...