Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 10. srpen 2009, 15:02:43 Předmět: Světlo na terénu |
|
|
Tak opět si nevím rady ani s pomocí internetu. Mám obyčejný terén, který se načítá podle výškové mapy. Na terénu mám jedno světlo, které nějak svítí, ale jakmile změním jeho směr většinou se nic nestane, nebo se to změní k nepoznání (zmizí stíny).
Můj cíl: dostan na terén 1 světlo, kterému budu moc měnit směr
Můj kód:
Výpočet normál:
kód: |
// vypocet normal na osvetleni
if ((x > 0) & (x < (width - 1)) & (y > 0) & (y < (height - 1)))
{
Vector3 v1 = new Vector3(2.0F, (heights[x + 1, y] - heights[x - 1, y]), 0.0F);
Vector3 v2 = new Vector3(0.0f, (heights[x, y + 1] - heights[x, y - 1]), 2.0f);
verts[v].normal = Vector3.Cross(v2, v1);
verts[v].normal.Normalize();
}
else
{
verts[v].normal = Vector3.Up;
}
|
VS a PS v effektu:
kód: |
struct VertexToPixel
{
float4 Position : POSITION;
float LightingFactor: TEXCOORD0;
float2 TextureCoords: TEXCOORD1;
};
struct PixelToFrame
{
float4 Color : COLOR0;
};
VertexToPixel Terrain_TexVS(float3 inPos : POSITION, float3 inNormal: NORMAL)
{
VertexToPixel Output = (VertexToPixel)0;
float4x4 WorldView = mul( gWorld, gView );
float3 P = mul( float4(inPos, 1), (float4x3)WorldView );
Output.Position = mul( float4(P, 1), gProj );
Output.TextureCoords.x = inPos.x/gTerrScale.x;
Output.TextureCoords.y = inPos.z/gTerrScale.y;
Output.LightingFactor = max(inNormal, -xLightDirection);
return Output;
}
PixelToFrame Terrain_TexPS(VertexToPixel PSIn)
{
PixelToFrame Output = (PixelToFrame)0;
Output.Color = tex2D(LayerMap0Sampler, PSIn.TextureCoords );
Output.Color.rgb *= saturate(PSIn.LightingFactor + xAmbient);
return Output;
}
|
Díky za pomoc a snad se mi to podařilo dobře vysvětlit.. |
|
Návrat nahoru |
|
 |
Deluxe

Založen: 31. 07. 2007 Příspěvky: 235 Bydliště: Oslavany
|
Zaslal: 10. srpen 2009, 15:23:08 Předmět: |
|
|
tohle:
kód: |
Output.LightingFactor = max(inNormal, -xLightDirection); |
je asi nejaka blbost ne?
Asi budes potrebovat nekde najit, jak vypocitat osvetleni. Google urcite nejakej vzorecek/priklad na stinovani najde. |
|
Návrat nahoru |
|
 |
Vilem Otte

Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 10. srpen 2009, 17:16:31 Předmět: |
|
|
citace: |
kód: |
Output.LightingFactor = max(inNormal, -xLightDirection); |
|
Velikost dopadového světla (diffuse light) spočítáš přes cosinus úhlu svíraného normálou a vektorem od světla k bodu (obojí normalizované - doporučuji normalizovat na úrovni pixel shaderu, nikoliv vertex shaderu) - neboli tzv. lambertův model (google - lambert's cosine law - pro více informací), je značně nepřesný pro většinu materiálů - takže jestli chceš něco přesnějšího a komplexnějšího tak bych doporučil Oren Nayar model dopadového světla - je popsán buď na google, nebo jestli máš tak v knize PBRT (kde je k němu i příklad kódu AFAIK). _________________ Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration. |
|
Návrat nahoru |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 11. srpen 2009, 11:51:33 Předmět: |
|
|
Možná to někomu přije jako hloupý dotaz, ale tohle opravdu nechápu...
Jak je možné pokud mám všechny normály už normalizované po jejich výpočtu tak v effektu dostanu jiný výsledek z A nebo z B
kód: |
A Output.Normal = mul(normalize(inNormal), gWorld);
B Output.Normal = mul(inNormal, gWorld);
|
Pokud budu vycházet z popisu funkce normalize, měla by vektor upravit na jednotkový se zachováním směru. Takže pokud jí zavolám 10x za sebou měl by být výsledek stejný jako na poprvé.
Proč se mi tedy v effektu výsledek změní? |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 11. srpen 2009, 14:47:42 Předmět: |
|
|
Tak nejdřív samozřejmě floating point operace jsou nepřesné, protože jsou po každé operaci zaokrouhlovány tak, aby byly vyjádřitelné pomocí dané reprezentace. Dále instrukce RSQ (1/sqrt, součást normalize) není přesná. Pokud se nemýlím, na GPU se implementuje pomocí jednoho bitového hacku (dá se odvodit) a dále zpřesňuje nějakou numerickou metodou, co rychle konverguje v těsné blízkosti kořene.
To všechno znamená, že velikost vektoru bude 1 nebo spíše skoro 1. Některé bity se mohou lišit, ale vizuálně je to nerozpoznatelné. Na operátory == a != si dej pozor. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 11. srpen 2009, 20:02:03 Předmět: |
|
|
Tak a nyní jsem hodím pár obrázků aby si vaši oči odpočinuly od čtení textů. Konkrétně podle nastavení LightDirection, nevím zda se mi chová terén správně nebo ne, proto Vás prosím o radu.
1) 0,0,0
terén je černý
2) 0,0,1
terén je černý
3) 0,0,1
terén je černý
4) 0,0,-1
terén je světlý (bez stínů)
5) -1,0,0
http://img31.imageshack.us/i/100rkr.jpg/
6) 0,-1,0
http://img34.imageshack.us/i/010efu.jpg/
7) 0,1,0
http://img14.imageshack.us/i/010jyk.jpg/
Je to jen pár vzorků, snad poznáte co bych mohl mít špatně. Normály by to být neměli kontroloval jsem je snad stokrát. |
|
Návrat nahoru |
|
 |
Deluxe

Založen: 31. 07. 2007 Příspěvky: 235 Bydliště: Oslavany
|
Zaslal: 11. srpen 2009, 20:14:03 Předmět: |
|
|
Dik za starost o nase oci. Mozna by bylo dobry sem hodit i kod shaderu, kterym pocitas ted to osvetleni. Myslim ze tady z toho moc nepozname (alespon ja). Podle obrazku mi to ani neprijde spatne, pokud je teren kolmej na osu Z. |
|
Návrat nahoru |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 11. srpen 2009, 20:31:03 Předmět: |
|
|
Tady to je:
kód: |
VertexToPixel Terrain_TexVS(float4 inPos : POSITION, float3 inNormal: NORMAL)
{
VertexToPixel Output = (VertexToPixel)0;
float4x4 WorldView = mul( gWorld, gView );
float3 P = mul(inPos, (float4x3)WorldView );
Output.Position = mul( float4(P, 1), gProj );
Output.TextureCoords.x = inPos.x/gTerrScale.x;
Output.TextureCoords.y = inPos.z/gTerrScale.y;
Output.Normal = mul(-inNormal, gWorld);
Output.LightDirection.xyz = -xLightDirection;
Output.LightDirection.w = 0;
return Output;
}
PixelToFrame Terrain_TexPS(VertexToPixel PSIn)
{
PixelToFrame Output = (PixelToFrame)0;
float lightingFactor = 1;
if (xEnableLighting)
lightingFactor = saturate(saturate(dot(PSIn.LightDirection, PSIn.Normal)) + xAmbient);
Output.Color = tex2D(LayerMap0Sampler, PSIn.TextureCoords );
Output.Color.rgb *= lightingFactor;
return Output;
}
|
|
|
Návrat nahoru |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 12. srpen 2009, 12:50:09 Předmět: |
|
|
Tak už jsem posledníhc 20 hodin svého volného času strávil bádáním nad světli a zjistil jsem že o nich nevím vůbec nic. Proto mám úplně obyčejný dotaz:
Pokud na terénu nastavím jedno světlo s určeným směrem, jaké možnosti osvětlení terénu budu mít??
Budu moct osvětlit:
1) +X
2) -X
3) +Z
4) -Z
5) +Y (uplná tma)
6) -Y (uplné světlo)
Je mé povědomí o světle nad terénem správné? Pokud ano, jak v jednotlivých případech bude vypadat nastavení směrového vektoru světla?? |
|
Návrat nahoru |
|
 |
Deluxe

Založen: 31. 07. 2007 Příspěvky: 235 Bydliště: Oslavany
|
Zaslal: 12. srpen 2009, 13:09:27 Předmět: |
|
|
Tak tohle uplne nachapu, jak to myslis. Ja bych osvetloval takhle:
Zvolim si bod kdekoli nad terenem (poloha "slunce"), tim dostanu vektor [0,0,0]->slunce, ten invertuju, mam vektor slunce->[0,0,0]. Nakonec ho normalizuju a mam smner slunce -> [0,0,0] a to je co potrebuju do shaderu pro smnerovy osvetleni. |
|
Návrat nahoru |
|
 |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 12. srpen 2009, 13:14:57 Předmět: |
|
|
Co má znamenat toto?
kód: |
Output.LightDirection.xyz = -xLightDirection;
|
Ty potřebuješ nastavit směr světla tak, aby to mělo nějaký smysl vůči natočení terénu. Takže zásadní otázka: jak máš orientovaný terén?
Pokud ve směru Z (tedy když člověk stojí na terénu, tak osa Z míří nahoru), tak aby světlo svítilo přímo zhora, tak by muselo být [0, 0, 1]. Náklon světla (pohyb Slunce) pak uděláš tím, že budeš hýbat složkami X a Y (přičemž je samozřejmě třeba normalizovat).
Jinak v tom pixel shaderu by stálo za vyzkoušení před dotnutím tu normálu a směr světla normalizovat... |
|
Návrat nahoru |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 12. srpen 2009, 13:31:34 Předmět: |
|
|
Terén mám od 0,0,0 do např. 257,0,257. Neuvažuji zde Y, ta je samozřejmě proměná.
Nevadí nějakým způspobem výpočtu osvětlení, že nemám terén orientovaný od 0,0,0 do 257,0,-257?? Všude v tutorialech to tak mají.. |
|
Návrat nahoru |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 12. srpen 2009, 13:35:37 Předmět: |
|
|
Augi napsal: |
Co má znamenat toto?
kód: |
Output.LightDirection.xyz = -xLightDirection;
|
Ty potřebuješ nastavit směr světla tak, aby to mělo nějaký smysl vůči natočení terénu. Takže zásadní otázka: jak máš orientovaný terén?
Pokud ve směru Z (tedy když člověk stojí na terénu, tak osa Z míří nahoru), tak aby světlo svítilo přímo zhora, tak by muselo být [0, 0, 1]. Náklon světla (pohyb Slunce) pak uděláš tím, že budeš hýbat složkami X a Y (přičemž je samozřejmě třeba normalizovat).
Jinak v tom pixel shaderu by stálo za vyzkoušení před dotnutím tu normálu a směr světla normalizovat... |
Pokud jsem oba verctory před dot normalizoval, nastavím směr světla na 0,0,1 , vše je osvětlené. Ale pokud začnu měnit X a Y terén se chová jako kdybych měnil Ambient, celý se ztmavuje nebo rozjasňuje... |
|
Návrat nahoru |
|
 |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 12. srpen 2009, 13:40:44 Předmět: |
|
|
No pokud tam máš velký kopce, tak ty kopce by měly bejt různě tmavý podle toho, jak jsou natočený vůči světlu. Pokud je terén víceméně placatej, tak "jako bys měnil ambient" je v pořádku. Resp. cos očekával jinýho? |
|
Návrat nahoru |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 12. srpen 2009, 13:45:22 Předmět: |
|
|
Augi napsal: |
No pokud tam máš velký kopce, tak ty kopce by měly bejt různě tmavý podle toho, jak jsou natočený vůči světlu. Pokud je terén víceméně placatej, tak "jako bys měnil ambient" je v pořádku. Resp. cos očekával jinýho? |
Teď jsem to zkoušel s opravdu vysokými kopci, ale i tak, na terénu není žádný stín, a při změně X a Y všechno pouze o odstín ztmavne a nebo zesvětlá, ale stím není nidke, celý terén je stejně osvětlený.. |
|
Návrat nahoru |
|
 |
|