GLSL

2013-02-19 28 views
9

'deki doku bitleri üzerinde hassas kontrol OpenGL ve GLSL kullanarak bir octree geçiş planı uygulamak ve verileri dokuda tutmak isterim. Doku verileri için çok çeşitli formatlar olsa da (farklı boyutlardaki yüzer ve tamsayılar), bitler üzerinde daha hassas bir kontrole sahip olmanın ve böylece daha fazla verimlilik ve kompakt depolama elde etmenin bir yolu olup olmadığını anlamakta bazı sıkıntılarım var. Bu sadece OpenGL ve GLSL'ye başvurmakla kalmayan genel bir sorun olabilir.GLSL

Basit bir oyuncak örneği olarak, 16 bitlik bir tam sayı içeren bir dokumuz olduğunu varsayalım. Her bir bitin iki boolitesini, bir 10 bit tam sayı değerini ve daha sonra bu dokuya 4 bit tamsayı değerini kodlamak istiyorum. Doku oluştururken bunu kodlamak için bir teknik var mı ve ardından GLSL gölgelendirici kullanarak doku örneklenirken bu bileşenleri deşifre et.

Düzenleme: Aslında ben biraz manipülasyon teknikleri arıyorum gibi görünüyor. Desteklendikleri için, biraz daha araştırdıktan sonra iyi olmalıyım.

+0

Biraz manipülasyon yapmayı nasıl istiyorsun? –

+0

GLSL 1.3'te (OpenGL 3.0) bit manipülasyonu mümkün, ancak GLSL'deki dokudan ham int okuyabiliyorsunuz bilmiyorum ... Texture2D float vec4'ü döndürüyor –

+0

@NicolBolas: Biraz daha arama yaptıktan sonra Ben. Bunu pek yapmadım, o yüzden emin değildim. Eğer GLSL destekliyorsa, bunun hakkında öğrenmeye nereden başlayacağımı anlayabilmeliyim! –

cevap

3

GLSL gölgelendiricilerinin içindeki tamsayı ve bit-manipülasyonlar OpenGL 3'ten beri desteklenir (bu nedenle size DX10 sınıfındaki donanımdan bahseder). Böylece, bu bit ana düzenini sadece gölgelendiricinin içinde yapabilirsiniz.

Ancak tamsayılarla çalışmak bir şeydir, onları dokudan çıkarmak başka bir şeydir. Standart OpenGL doku formatları (kullanabildiğiniz gibi) ya direkt olarak (GL_R16F gibi) ya da normalleştirilmiş sabit nokta değerlerini (GL_R16, başlatılmamış için etkin tamsayılar;)), ancak bunlardan okuyarak (texture, texelFetch veya neyse) net olarak, gölgelendiricideki değerlerin yüzdesini çekersiniz, bu sayede dahili olarak depolanan tamsayıya ait orijinal bit desenini kolayca veya güvenilir olarak çıkaramazsınız.

Gerçekten kullanmanız gereken şey, OpenGL 3'ü gerektiren bir tamsayı doku (veya belki de GL_EXT_texture_integer uzantısı, ancak yine de GL3'ün muhtemelen desteklediği donanım desteği). Bu yüzden dokunuz için gerçek bir tamsayı iç formatı kullanmanız gerekir, ör. GL_R16UI (1 bileşenli 16 bit işaretsiz tamsayı için), normal sabit nokta biçimlerine (16 bit doğruluklu normalleştirilmiş [0,1] -renkli için GL_R16) benzer. Daha sonra gölgelendiricide, örnek olarak bir tamsayı örnekleyici türü kullanmanız gerekir. Örneğin, örn. işaretsiz tamsayı 2D doku için usampler2D (ve aynı şekilde isampler... imzalı varyantları için) gerçekte texture veya texelFetch aramalardan işaretsiz bir tamsayı almak için:

CPU:

glTexImage2D(GL_TEXTURE_2D, 0, GL_R16UI, ..., GL_R, GL_UNSIGNED_SHORT, data); 

GPU:

uniform usampler2D tex; 

... 
uint value = texture(tex, ...).r; 
bool b1 = (value&0x8000) == 0x8000, 
    b2 = (value&0x4000) == 0x4000; 
uint i1 = (value>>4) & 0x3FF, 
    i2 = value & 0xF; 
+0

Merhaba, bu gltexImage2D benim için bir hata döndürüyor, lütfen bir göz atabilir misiniz? http://stackoverflow.com/questions/21625709/jogl-creating-only-red-channel-u16-but-getting-texture-type-and-format-combina – elect