2012-06-04 13 views
9

Bir parçası başına aydınlatma yapıyorum ve normal vecter düzeltirken ben bu kodu var: vec3 f_normal = mat3(MVI) * normal; MVI Nerede: mat4 MVI = transpose(inverse(ModelViewMatrix));. Peki mat3(MVI) ifadesinden sonra ne dönüyor?ne yapıyoruz extractly mat3 (a mat4 matrisi) ifadesi GLSL içinde?

+2

Eh, basit muhakeme (ve bilgisayar grafikleri matematiksel temelleri sadece küçük bir anlayış) üst sol 3x3 parçası olduğunu belirler. Bunun yanı sıra, her şekilde, matrisinizi gölgelendiriciye dönüştürmeyin ve tersine çevirmeyin. Bu vertex'ler değişmez ve (o tek matriks için artık almaz yerde) CPU üzerinde yapılabilir. Hızlı cevap için –

cevap

11
mat3(MVI) * normal 

4x4 matris üst 3x3 matris döndürür ve bu normal çarpar. Bu matris 'normal matris' olarak adlandırılır. Normlarını dünya uzayından göz alanlarına getirmek için bunu kullanıyorsunuz. Matrisin üst 3x3 kısmı ölçek ve rotasyon için önemlidir, geri kalanı sadece çeviri içindir (ve normlar asla çevrilmez)

Dünya uzayından göz alanına normal bir şekilde girmek için 3x3 tersine ihtiyacınız vardır. model görünüm matrisinin aktarımı. bu durumda othro Normal (hiçbir düzgün olmayan ölçeğinde) da matrisin sürece orijinal Matris, ters çevrilmiş devrik aynıdır.

+0

Modelview matrisinin üst 3x3'ünü kullanmak, yalnızca tek tip olmayan ölçekler olmadığında çalışır, aksi takdirde model görünümünün tersini (4x4 matrisi) kullanmanız gerekir. Bir 4x4 matrisi ile çarpılırken, normalin w bileşenini sıfır olarak ayarlamanız gerektiğini unutmayın. –

+0

@racarate düzeltildi. İnsanların yanlış fikir edinmesini önlemek için cevabımı değiştireceğim. –

2

GLSL types'dan: "Başka bir matristeki matris yapısı yapılırken boyut sınırlaması yoktur. Böylece 2x4 matrisinden bir 4x2 matrisi oluşturabilir, yalnızca ilgili öğeler kopyalanabilir.". Sonuç olarak, MVI'nın sol üst 3x3 alt matrisini elde edersiniz.

+0

teşekkürler, bu nedenle nihai sonuca etkiler geliyor? (neden normal vektörlerde dördüncü elemanı kullanmaz, fakat MVI üzerinde bazı elemanları çıkarmaz?) –

+3

Genel bir işlemdir ve üzerinde çalışılan temel matrisin semantiği hakkında hiçbir şey bilmiyor. –