dev.gamez.lv Forum Index dev.gamez.lv
Latvian Game Developers Community
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups 

Problēma ar dot productu

 
dev.gamez.lv Forum Index -> Grafikas programmēšana un teorija
View previous topic :: View next topic  
Author Message
elvman
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 09 Apr 2003
Posts: 1278
Location: Kuldiga

PostPosted: Fri Aug 17, 2007 3:34 pm    Post subject: Problēma ar dot productu

Uzkodēju ūdeni ar atsplgu, bet atspulgs nestrādā tā, kā vajag.
Es vertex sheiderī pixel sheiderim padodu vertexa pozīciju:
Code:
...

struct PS_OUTPUT
{
    float4 Color : COLOR0;  // Pixel color   
};

struct VS_OUTPUT
{
...   
   float3 Position3D            : TEXCOORD3;
};
...

VS_OUTPUT main(VS_INPUT Input)
{
   VS_OUTPUT Output;

   Output.Position3D = Input.Position;
   
   return Output;
}


Pēc tam no programmas padodu pixel shaderim kameras pozīciju

Code:
float3      CameraPosition;  // kameras pozīcija
...

struct PS_INPUT
{
...      
   float3 Position3D            : TEXCOORD3;
};


Pēc tam izrēķinu un normalizēju eye vektoru:

Code:
float3 eyeVector = normalize(CameraPosition - Input.Position3D);


Pēc tam izrēķinu šī vektora un vektora (0,1,0) (uz augšu) dot produktu un aprēķinu cik daudz atspulga būs redzams un cik daudz zemūdens skata:

Code:
float3 normalVector = float3(0,1,0);
   
float fresnelTerm = max( dot(eyeVector, normalVector), 0.0f );
   
   
Output.Color = refractiveColor*fresnelTerm + reflectiveColor*(1-fresnelTerm);

return Output;


Problēma ir tāda, ka jo tuvāk ūdens virsmai es nonāku, jo mazāks ir dot produkts (līdz ar to atspulgs kļūst arven redzamāks, bet zemūdens skats

neredzamāks), turpretī, jo tālāk aizeju no ūdens, jo caurspīdīgāks tas paliek (līdz beidzot ir redzams tikai zemūdens skats). Pēc loģikas,

nemainoties kameras leņķim, ūdens caurspīdīgumam nebūtu jāmainās, jo abi vektori ir normal vektori, tātad no distances tur nekas nav atkarīgs.
_________________
long time; /* know C */
Back to top
View user's profile Visit poster's website
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Fri Aug 17, 2007 6:55 pm    Post subject:

Vertex šeiderī ieejas pozīcija nav jāreizina ar modelview matricu, pirms to padot uz piksel šeideri (ja tu CameraPosition nepadod object-speisā)? Citādi sanāk, ka tu pikselšeiderī atņem divus vektorus no pilnīgi dažādām atskaites sistēmām, kas reti ir prātīga lieta. Un rezultātā tu dot productu ņem no ļoti jocīga vektora, kurš arī pat pie nemainīga kameras leņķa maina savu virzienu atkarība no kameras attāluma, ne?

Last edited by bubu on Fri Aug 17, 2007 7:31 pm; edited 1 time in total
Back to top
View user's profile Send e-mail
elvman
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 09 Apr 2003
Posts: 1278
Location: Kuldiga

PostPosted: Fri Aug 17, 2007 7:29 pm    Post subject:

Paldies bubu! Neiedomājos.
_________________
long time; /* know C */
Back to top
View user's profile Visit poster's website
MoKa



Joined: 10 Oct 2007
Posts: 79
Location: Daugavpils

PostPosted: Wed Jan 23, 2008 2:47 pm    Post subject:

Как понял хочешь создать эффект FallOff (Это когда на сильно пралельных гранях идёт к примеру засветление?)
Как вот тут: http://www.venomgfx.com.ar/tutos/falloff/falloff.jpg

Если да, то нужно от позиции камеры, отнимать позицию вершины переможенную на мировую матрицу.
Если нужен учёт нормал карты, тогда нужно перемножать на матрицу с тангентом, бинормалью и нормалью.

Вот к примеру вершинный:
Code:
   OUT.position      = mul(IN.position,WorldViewProj);
   OUT.pWorld      = mul(IN.position,World);

   IN.normal      = mul(IN.normal,World);
   IN.binormal      = mul(IN.binormal,World);
   IN.tangent      = mul(IN.tangent,World);
   OUT.lightP      = camPos-OUT.pWorld;
   OUT.lightVec      = mul(float3x3(IN.tangent,IN.binormal,IN.normal),OUT.lightP);


А в пиксельном уже, dot(этот вектор,(пикселем нормал карты *2 - 1))
Таким образом у тебя будет учёт нормал карты. И геометрии воды, таким образом на этой основе и параллакс для обыкновенной геометрии не сложно сделать, так-же и юзая текстурную проекцию (замето КубеМап).
Back to top
View user's profile Visit poster's website
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Wed Jan 23, 2008 3:55 pm    Post subject:

elvmans jau pirmā posta pirmajā rindā pateica, ko vēlas panāk - "ūdeni ar atsplgu". Un problēma nebija ne ar kādām normālmapēm vai tangentiem. Problēma bija ar nepareizām koordināšu sistēmām (world vs object), kā rezultātā dot-product darīja galīgi ne to, ko tam vajadzēja - t.i. nerēķināja kosinusu no leņķa starp vektoriem.

P.S. Iesaku arī iegādāties kalendāru. Šogad jau ir 2008. gads :)
Back to top
View user's profile Send e-mail
MoKa



Joined: 10 Oct 2007
Posts: 79
Location: Daugavpils

PostPosted: Wed Jan 23, 2008 4:20 pm    Post subject:

Да я понимаю, ты ответил на вопрос, а я добавил Smile
_________________
Текущий Инструментарий: BlitzMax + Xors3D + FastImage + PhysX + sFXe
Back to top
View user's profile Visit poster's website
Display posts from previous:   
dev.gamez.lv Forum Index -> Grafikas programmēšana un teorija All times are GMT + 2 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group