2009-08-17 28 views
14

Tamam, benim GLSL parça gölgelendirici ben uzayda belirli bir hattan parçanın mesafeyi hesaplamak mümkün istiyorum.GLSL içinde gl_FragCoord nasıl hesaplanır

varying vec2 fake_frag_coord; 
//in vertex shader: 
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 
fake_frag_coord=(gl_ModelViewProjectionMatrix * gl_Vertex).xy; 

Şimdi parça gölgelendirici beklediğim:

Bunun sonucu ilk gl_FragCoord biter neyi yansıtmak benim köşe gölgelendiricisi değişen vec2 kümesi kullanmak çalışıyorum olmasıdır

gl_FragCoord.xy==fake_frag_coord 

Ama öyle değil. gl_Position'da boru hattı fake_frag_coord10'da yapmamayı ihmal ettiğim gl_FragCoord'a çevirmek için ne yapar?

cevap

11

gl_FragCoord ekran koordinatları, yani o Pozisyon dayalı ekran boyutu ve üretmek için böyle hakkında bilgi sahibi gerekiyordu. Oluşturduğunuz fake_frag_coord, ekranda normalleştirilmiş cihaz koordinatlarındaki bir noktaya karşılık gelecektir (-1'den 1'e kadar). Dolayısıyla, belirli bir boyutta ekranın boyunun yarısı ile çarpacak olursanız ve ardından bu boyutu eklediyseniz, gerçek ekran pikselleri elde edersiniz.

+1

Sana yanlış biri olmadığını, ancak potansiyel gl_ModelViewProjectionMatrix * gl_Vertex kullanarak hesaplama hataları tanıtan konusunda haklı. – karx11erx

+2

Nitpick: Rasterizasyon işlemi sırasında (köşe gölgelendirici ve parça gölgelendirici arasında) perspektif bölümlemesini gerçekleştirmediğinizden, normalize edilmiş cihaz koordinatlarından ziyade size klipsli alan koordinatları vereceksiniz. http://www.glprogramming.com/red/chapter03.html#name1 – Pike65

+0

@ Pike65 Bu sadece bir nitpick değil, bir perspektif izdüşümü için tamamen farklı değerler elde etmelidir. –

0

sahip sorunun gölgelendiricide bilgisayarlı gl_ModelViewProjectionMatrix * gl_Vertex ıstedgım sabit fonksiyon boru hattı verimleri olmadığıdır. Aynı sonuçları elde etmek için, fake_frag_coord = ftransform() yapın.

Düzenleme: Ekran boyutları ile

Ve sonra ölçek.

+0

ftransform, fragcoord yerine pozisyonu üretir. Soru, pozisyonun nasıl alınacağını sormuyor. –

+0

Cevabım tamamen yanlış değildi. Fake_frag_coord'u ekran boyutlarınızla ölçeklendirmeniz gerekir, ancak fake_frag_coord = gl_ModelViewProjectionMatrix * gl_Vertex veya = ftransform() kullanmanıza bağlı olarak farklı sonuçlar elde edebilirsiniz. NDC'de – karx11erx

-2
varying vec2 fake_frag_coord; 
//in vertex shader: 

fake_frag_coord=(gl_ModelViewMatrix * gl_Vertex).xy 
0

Keşke daha fazla yetkili olsaydım, ben de nitpick yapabilirdim. İşte biliyorum. OpenGL bir pozisyon parça gölgelendirici geldiğinde zaman bunu, o NDC koordinatlarında zaten, ve o zamana kadar W 1.0, sen W bölün gereken tek sefer olursa olduğunu olacak, sizin için otomatik olarak Böl-By-W gerçekleştirir CPU tarafında aynı matematiği yapmak ve aynı sonuçları elde etmek istiyorsanız VEYA, bazı garip nedenlerden dolayı, NDC koordinatlarını vertex shader'ınızda kullanmak istemişsinizdir.

+1

'gl_FragCoord' ** ** değil **. Pencere koordinatlarında. –