SORU
8 Ocak 2011, CUMARTESİ


Açık vs Otomatik OpenGL gölgeleme konumu için bağlayıcı nitelik

OpenGL shader programı için öznitelik yerleri ayarlarken, iki seçenek ile karşı karşıyayız:

() glBindAttribLocationaçıkça bir öznitelik tanımlamak için bağlama yeri.

ya

() glGetAttribLocationotomatik olarak atanan bir öznitelik yer edinmek için bağlama sonra.

Diğer üzerinde kullanmak için programı nedir?

Ve hangisi varsa, uygulamada tercih edilir?

CEVAP
9 Ocak 2011, Pazar


Ben tercih için iyi bir sebepaçıkkonum tanımı.

Geometri verilerinizi tuttuğunuz düşününDizi Nesneleri Köşe.Belirli bir nesne için, indis örneğin karşılık, böyle bir VAO oluşturun:

  • 0 dizin: pozisyonları
  • dizin 1: normaller,
  • dizin 2: texcoords

Şimdi tek bir nesne çizmek için istediğiniz göz önünde bulunduruniki farklı gölgeleme. Bir shader gerektirirpozisyon ve normal verigiriş, diğeri gibipozisyonlar ve doku kordinatları.

Bu gölgeleme derleme, ilk shader 1 öznitelik dizin 0 ve normaller de pozisyonları bekliyoruz göreceksiniz. Diğer 0 pozisyon bekleriz ama 1 doku kordinatları.

https://www.opengl.org/wiki/Vertex_Shader alıntı:

Otomatik atama

Eğer önceki iki yöntem de öznitelik bir dizin için bir giriş atarsanız, o zaman endeks programına bağlandığında otomatik olarak OpenGL tarafından atanır. Endeks atanan tamamen keyfi ve eğer aynı köşe GeForce kodu kullandıkları, hatta bağlı, farklı programlar için farklı olabilir.

Bu anlamına gelirhem gölgeleme ile VAO kullanmak mümkün olmaz.VAO başına bir yerine, mesela, nesne, - en kötü durumda - ayrı bir ihtiyacınız olurShader başına nesne başına VAO.

Zorlama gölgeleme kullanmak için kendi nitelik numaralandırma sözleşmesi) glBindAttribLocation Bu sorunu çözmek kolay - tüm yapmanız gereken tutmak için tutarlı bir ilişkisi özellikleri ve bunların kurulan Kimlikleri ve kuvvet gölgeleme için kullanan Kongre bağlantı.

(Ayrı VAOs kullanmazsınız, ama hala kodu daha açık hale gelebilir, Eğer gerçekten büyük bir sorun değil.)


BTW:

OpenGL shader programı için öznitelik yerleri ayarlarken, iki seçenek ile karşı karşıyayız

OpenGL/GLSL 3.3 üçüncü bir seçenek daha var: doğrudan konumu Belirtinshader kodu. Bu gibi görünüyor:

layout(location=0) in vec4 position;

Ama bu ES GLSL shader dilinde mevcut değildir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • André Frizzo

    André Frizz

    16 Aralık 2006
  • NCIX Tech Tips

    NCIX Tech Ti

    2 Ocak 2007
  • sWooZie

    sWooZie

    9 ŞUBAT 2006