|
dev.gamez.lv Latvian Game Developers Community
|
View previous topic :: View next topic |
Author |
Message |
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: 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 |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: 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 |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Fri Aug 17, 2007 7:29 pm Post subject: |
|
Paldies bubu! Neiedomājos. _________________ long time; /* know C */ |
|
Back to top |
|
|
MoKa
Joined: 10 Oct 2007 Posts: 79 Location: Daugavpils
|
Posted: 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 |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: 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 |
|
|
MoKa
Joined: 10 Oct 2007 Posts: 79 Location: Daugavpils
|
Posted: Wed Jan 23, 2008 4:20 pm Post subject: |
|
Да я понимаю, ты ответил на вопрос, а я добавил _________________ Текущий Инструментарий: BlitzMax + Xors3D + FastImage + PhysX + sFXe |
|
Back to top |
|
|
|
|
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
|