2015-09-29 14 views
5

OpenGL kullanmayı öğreniyorum ve şaşırmış renk her zaman 4 tek hassasiyetli float giriş noktası numarasından oluşan vec4 yapı olarak tanımlanmış gibi görünüyor.OpenGL, normal olarak rengi tanımlamak için 4 yüzer kullanır?

4 x 32 = 128 bits or 16 bytes 

gerekli olduğunu tüm tanımlamak için: bellek boyutu grafik belleğine kopyalanması durumunda bir endişe (endeksleri tepe tarayıcıları ile mevcut nedeni bu) Her rengin boyutudur çünkü şaşırıyorum 32 bit renk 32 bittir (4 bayt)! ARGB renk kanallarını neden bayt olarak tanımlamıyorsunuz?

+3

OpenGL, her bileşen için bayt kullanan glColor3ub işlevine de sahiptir. – Dai

+0

128 bit 16 değil 16 bayttır. –

+0

computergraphics.stackexchange. . . – imallett

cevap

5

renk daima

İlk 4 tek hassasiyetli kayar nokta sayılar içeren bir vec4 yapı olarak tanımlanabilir görünüyor: o değil. Bir doku yüklediğinizde, büyüklükteki formatlardan birini dahili format olarak kullanmayı deneyin. Örneğin, GL_RGBA8, kanal başına 8 bitlik bir normalleştirilmiş formattır. GL_RGBA16F, kanal başına 16 bit kayan nokta biçimidir. Çok var.

Çeşit, dediğiniz gibi bellek nedenleriyle değil, aynı zamanda algoritmik seçimler için sağlanır. Örneğin. Tek kanallı bir tam sayı dokusunu 4 baytlık dört kanallı bir doku olarak okumak için doku görünümlerini kullanabilirsiniz. Başka bir örnek olarak, 64-bit atomları kullanarak tek-geçiş derinliği soyma için, bir kayan noktalı derinlik tamponunu bir atomik tamsayı tamponu olarak görüntüleyebilirsiniz.


Vertex verilerine gelince, yine seçiminiz vardır. API, verilerinize farklı adımlar ve boyutlar sağlar. Ancak dahili olarak, biçim hemen hemen her zaman gölgelendirici çalışmaya başlamadan hemen önce kayan noktaya dönüştürülür.

Neden? Çünkü tüm veriler bir kayan nokta işlemcisi tarafından zaten işleniyor. Yaptığınız her şey - karıştırma, doku modülasyonu, BRDF modülasyonu, vb. - kayan noktalarda yapılır. Bu iyi; oluşturma genellikle parça gölgelendirici doku erişimlerine bağlıdır, bu nedenle kayan nokta hesaplaması nispeten ücretsizdir.

+0

anlamlıdır, matematik hesaplamalarında byte 'leri kullanmak istemez – markmnl