Önceki başlık :: Sonraki başlık |
Yazar |
Mesaj |
haydar
Kayıt: Jun 01, 2005 Mesajlar: 22 Nereden: Adana
|
Tarih: Fri Jul 22, 2005 3:38 pm Mesaj konusu: Neden WorldInverseTraverse? |
|
|
Merhabalar Site Sakinleri,
Shader kodları incelerken bir şey dikkatimi çekti. Pozisyonları dünya koordinatlarına taşımak için World matrisi ile tranform ediyorlar, buraya kadar tamam. Ama normalleri dünya koordinatlarına taşımak için neden World matrisi dururken WorldInverseTraverse diye bir matrisle transform ediyorlar onu anlayamadım. Yardımcı olur musunuz?
WorldInverseTraverse matrisine baktım, World matrisinin tersinin transpoz unu alarak yapıyorlar.
Başka bir örnekte de normalleri yine World matrisi ile transform etmişler, onu anladım. Ama neden World matrisinin tersinin transpozu ile tranform etmişler anlamadım işte
Haydar |
|
Başa dön |
|
|
haydar
Kayıt: Jun 01, 2005 Mesajlar: 22 Nereden: Adana
|
Tarih: Fri Jul 22, 2005 3:40 pm Mesaj konusu: |
|
|
Çok pardon yau, o kadar çalışınca beynim sulanmış
WorldInverseTraverse değil WorldInverseTranspose matrisin adı.
Yanlış yazmışım |
|
Başa dön |
|
|
stroma
Kayıt: Mar 31, 2003 Mesajlar: 169
|
Tarih: Fri Jul 22, 2005 5:32 pm Mesaj konusu: |
|
|
ne işe yarayan bir shader kodu acaba bahsettiğin?
shader içerisinden vertex position dönüşümü için:
ModelViewProjectionMatrix * IncomingVertex yapılır. tabii, shader bu, istediğini yaparsın, planar bir shadow için farklı şekle çevrilir mesela.
not: bazı kart farklılıkları yüzünden yukardaki kod her zaman yerine oturmaz(özellikle multipass kullanırken), bu nedenle glsl için ftransform kullanmak daha iyi*
*orange book: In general, the vertex shader code
gl_Position = gl_ModelViewProjectMatrix * gl_Vertex
will not result in positional invariance because of possible compiler optimizations and potential underlying hardware differences. |
|
Başa dön |
|
|
OsmanTuran
Kayıt: Apr 09, 2004 Mesajlar: 210 Nereden: Mersin - K.Maraş gel-git halinde
|
Tarih: Fri Jul 22, 2005 6:37 pm Mesaj konusu: |
|
|
Normal vektorlerini siradan vertex bilgileri gibi world matrisiyle transform edemezsin. Dogru vektorlere ancak WorldInverseTranspose matrisiyle transform ederek ulasabilirsin. Nedeni nedir diyorsan nvidia'nın per-pixel lighting ile ilgili whitepaper larini karistir (Eski tarihli olanlar). Orada cok guzel bir sekilde sekillerle anlatiliyor. |
|
Başa dön |
|
|
stroma
Kayıt: Mar 31, 2003 Mesajlar: 169
|
Tarih: Fri Jul 22, 2005 8:11 pm Mesaj konusu: |
|
|
ben eksik anlamışım olayı. kusura bakma.
cevabı Osman Turan ın dediği yerde veya benim daha açıklayıcı bulduğum http://www.lighthouse3d.com/opengl/glsl/index.php?normalmatrix adresinde bulabilirsin. nvidia da slide lar var, pek anlaşılmıyor olay.
verdiğim adreste olay glsl ile anlatılıyor. gl_NormalMatrix dedikleri 3x3 inverse transpose model-view matrix in ta kendisidir aslında.
kolay gelsin. |
|
Başa dön |
|
|
khognar
Kayıt: Jul 19, 2005 Mesajlar: 11 Nereden: Ankara
|
Tarih: Sun Jul 24, 2005 2:22 am Mesaj konusu: |
|
|
vertex ve normal vektörlerin transformasyonunda hiç bir fark yoktur.ancak oPos registerı setlenirken özel olarak projeksiyon(matWorldViewProjection) matrisi kullanılır.bunun nedeni ise output registerının gözlem merkezine olan bağımlılığıdır.normal vektörlerinde projeksiyon matrisinin kullanılmamasının temel nedeni shader sabitlerine yüklenen ışık konumlarının gözlem merkezinden bağımsızlığıdır.
transformasyon(matWorldView) ve projeksiyon(matWorldViewProjection) matrisleri arasındaki tek fark projeksiyon matrisindeki gözlemci bilgisidir.
transpose işleminin bahsettiğin olayla bi ilgisi yoktur.her 2 matrisde işleme sokulmadan transpose edilir.en azından directx'de böyle.opengl'de bunu otomatik gerçekleştiren bi yapı varmı bilemiyorum.
vertex dönüşümü için transformasyon matrisinin kullanıldığı alanlara bi örnek vermek gerekirse sis , dalgalanma gibi vertex koordinatlarının kullanıldığı efeklerdeki efek katsayıları üretilimi.
daha ayrıntılı bilgi için directx sdk'sındaki dönüşümler başlığını incelemeni tavsiye ederim.çalışmalarında başarılar. |
|
Başa dön |
|
|
haydar
Kayıt: Jun 01, 2005 Mesajlar: 22 Nereden: Adana
|
Tarih: Mon Jul 25, 2005 4:20 pm Mesaj konusu: |
|
|
Sağolasın stroma kardeş, şimdi anladım sebebini. Böyle doğrudan link verildiğinde çok etkili oluyor. Çok yaşa e mi |
|
Başa dön |
|
|
KePhReNZ
Kayıt: Jan 02, 2003 Mesajlar: 55 Nereden: İzmir
|
Tarih: Mon Jul 25, 2005 9:40 pm Mesaj konusu: |
|
|
Merhaba,
Normal koşullar altında obje koordinatlarından dünya koordinatlarına taşımanın hiçbir sakıncası yoktur. Bu durum sadece ve sadece transformasyon orthogonal bir matrisle yani transpozu tersine eşit ( sağolassın asyncore bu eşşeğe orthogonal matrisi hatırlattığın için ) bir matrisle gerçekleştirilebilir.
Bu translation, rotation ı kapsar, eğer uniform scaling yoksa yani bir boyutta diğerlerinden farklı boyut değiştirme işlemi yapılıyorsa matrisin orthoganlliği bozulur. Bu durumda Normal , normali bulunduğu yüzeye göre çevirmek gerekir. Bu yüzden bazi işlemler ugulanır. Bunlar sonucu oluşan transformasyon world transformasyonunun tersinin transpozu şeklindedir.
Saygılarımla,
Ahmet Bilgili |
|
Başa dön |
|
|
asyncore
Kayıt: Jan 13, 2004 Mesajlar: 110 Nereden: Gevrek, darı ve çiğdem yenen yerden
|
Tarih: Mon Jul 25, 2005 11:04 pm Mesaj konusu: Re: Neden WorldInverseTraverse? |
|
|
Estafurullah KePhReNZ'cim teknikıl dayrektırım. Ben, Sokrates misali dialekt ile bildiğin bilgiyi ortaya çıkardım o kadar.
haydar demiş ki: |
Başka bir örnekte de normalleri yine World matrisi ile transform etmişler, onu anladım. |
KePhReNZ'e ek olarak, birşey de bena söyliyim. Tranform matrisin ortogonalsa (yani döndürme, öteleme ve düzgün ölçeklendirme (rotation, translation, uniform scaling) işlemlerinden oluşuyorsa) Inverse Transpose yapmaya gerek yoktur. Zira, ortogonal matrisin tersi evriğine (transpozuna) eşittir. İki işlem birbirinin tersleyeni olduğundan, sonuç tranform matrisine eşittir.
Bu yüzden haydar kardeş, bazı örneklerde World bazılarında WorldInversaTranspose görürsün normalleri transform etmek için.
Saygılar, Sevgiler, Bilgiler |
|
Başa dön |
|
|
lucifer
Kayıt: Nov 02, 2002 Mesajlar: 215 Nereden: Istanbool
|
Tarih: Tue Jul 26, 2005 11:08 am Mesaj konusu: Re: Neden WorldInverseTraverse? |
|
|
asyncore demiş ki: |
Ben, Sokrates misali dialekt ile bildiğin bilgiyi ortaya çıkardım o kadar. |
Dialektik materyalizm forumu acilsin.
Tangent space'de butun normaller (0,0,1)'dir diye tisort bastirilsin, oyorg uyelerine dagitilsin.
Bi de arkadaslar, normallerinize sahip cikin, kimseye transpoze ettirmeyin.
Bir de matris'de scaling varsa, normallerin uzunlugu da degisir genelde, yeniden normalize etmek gerekir...vb. |
|
Başa dön |
|
|
asyncore
Kayıt: Jan 13, 2004 Mesajlar: 110 Nereden: Gevrek, darı ve çiğdem yenen yerden
|
Tarih: Tue Jul 26, 2005 8:23 pm Mesaj konusu: |
|
|
Hayatında en az bir kere shader (GL tabirince program) yazmış ya da incelemiş olanlar bilirler ki, normaller world matrisi (içinde non-uniform scaling olmasına bakılmaksızın) ile transform edildiğinde her halukarda normalize edilirler... |
|
Başa dön |
|
|
DG
Kayıt: Mar 06, 2004 Mesajlar: 351 Nereden: Eskişehir
|
Tarih: Wed Jul 27, 2005 12:42 am Mesaj konusu: |
|
|
asyncore demiş ki: |
Hayatında en az bir kere shader (GL tabirince program) yazmış ya da incelemiş olanlar bilirler ki, normaller world matrisi (içinde non-uniform scaling olmasına bakılmaksızın) ile transform edildiğinde her halukarda normalize edilirler... |
Bu kısmı anlayamadım yahu. Eğer bahsettiğimiz bir transformasyonsa ve matrisin det=+- 1 ise yani saf döndürme veya saf yansıtma matrisi ise normal'in boyuna bir şey olmaması gerek. Her durumda neden parmaklayalım ki? Olaya shader girince ne oluyor ki?
Inverse Transpoze'un benim bildiğim olayı şudur:
Elimizde plane'e ait bir tanjant vektörü (t) var bir de plane'in normali var (n)
Bu iki vektör birbirine dik olduğu için ilk durumda skaler çarpımlarının (dot) sıfırdır: n . t = 0
Şimdi, elimizdeki geometriyi M gibi bir dönüşüm matrisine tâbi tuttuk. Haliyle normal de bir dönüşüm geçirdi, o da N gibi bir matrisle dönüşmüş olsun. Dönüşümden sonra da ilk eşitliğin gerçekleşmesi gerekir. Yani tanjant yine normale dik olmalı.
Kod: |
Not: tp() fonksiyonu ile gösterilen, transpoz işlemidir.
Nn . Mt = 0 // Vektörlerin dönüşümlerden sonraki hallerinin skaler çarpımı yine 0 olmalı
tp(Nn)Mt = 0 // Vektör skaler çarpımının matris çarpımı şeklinde ifadesi
tp(n)tp(N)Mt = 0 // İki matrisin çarpımlarının tranpozları, tranpozlarının ters sırada çarpımlarına eşit olmasından yararlandık
|
şimdi tp(t) ile v'nin matris çarpımının 0 olduğunu biliyoruz ki bu zaten 'n . t' ifadesine eşit. Bu eşitliğin sağlanabilmesi için şu koşul gerekli:
Kod: |
Not: 'I' diye belirtilen birim matris, tek tırnak (') işareti ile belirtilen işlem matris tersi.
tp(N)M = I
tp(N) = M' // Her iki tarafı da M' ile çarptık, sol taraftaki MM' ifadesi I oldu ve kayboldu haliyle.
N = tp(M') // Her iki tarafın da transpozunu aldık |
Yani normali dönüştüren matris tanjantı dönüştüren matrisin tersinin transpozu.
Resimleri sonradan silmek zorunda kalıyorum diye böyle yazdım ama bundan sonra imageshack'a veya başka bir yere atarım. Kendim bile bir şey anlamadım umarım siz anlarsınız arkadaşlar.
Bu arada bu bilgiler Eric Lengyel'in yazdığı "Mathematics for 3D Game Programming and Computer Graphics, Second Ed." kitabın 86. sayfasındandır. |
|
Başa dön |
|
|
DG
Kayıt: Mar 06, 2004 Mesajlar: 351 Nereden: Eskişehir
|
Tarih: Wed Jul 27, 2005 12:45 am Mesaj konusu: |
|
|
Pöeg Pöeg Stroma'nın verdiği linkte zaten her şey anlatılmış. Boşa kastık onca. Neyse... |
|
Başa dön |
|
|
lucifer
Kayıt: Nov 02, 2002 Mesajlar: 215 Nereden: Istanbool
|
Tarih: Wed Jul 27, 2005 8:20 am Mesaj konusu: |
|
|
Efendim saygilar,
asyncore demiş ki: |
Hayatında en az bir kere shader (GL tabirince program) yazmış ya da incelemiş olanlar bilirler ki, normaller world matrisi (içinde non-uniform scaling olmasına bakılmaksızın) ile transform edildiğinde her halukarda normalize edilirler... |
Hayatimda en cok bir-iki kere vertex shader yazmistim, o da seneler onceki supersonik ultramatik gforce2mx kartimdaydi, dolayisiyla bilmiyorum boyle bisii :) Yada biliyorduysam da unutmusumdur.
Sokrates diyince, askerde universite terk bi arkadas vardi, bi ara icinde 'sokrat' gecen bir cumle kurmustum, eleman da 'evet, sokrat, yuce insan, hastasiyiz, kanki benim' demisti. Boyle de bir anim var. |
|
Başa dön |
|
|
|