.[ ČeskéHry.cz ].
Světlo na terénu
Jdi na stránku 1, 2, 3  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Juraj



Založen: 06. 12. 2007
Příspěvky: 189

PříspěvekZaslal: 10. srpen 2009, 15:02:43    Předmět: Světlo na terénu Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Deluxe



Založen: 31. 07. 2007
Příspěvky: 235
Bydliště: Oslavany

PříspěvekZaslal: 10. srpen 2009, 15:23:08    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vilem Otte



Založen: 18. 09. 2007
Příspěvky: 462
Bydliště: Znojmo - Sedlesovice, Kravi Hora

PříspěvekZaslal: 10. srpen 2009, 17:16:31    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
Juraj



Založen: 06. 12. 2007
Příspěvky: 189

PříspěvekZaslal: 11. srpen 2009, 11:51:33    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 11. srpen 2009, 14:47:42    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Juraj



Založen: 06. 12. 2007
Příspěvky: 189

PříspěvekZaslal: 11. srpen 2009, 20:02:03    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Deluxe



Založen: 31. 07. 2007
Příspěvky: 235
Bydliště: Oslavany

PříspěvekZaslal: 11. srpen 2009, 20:14:03    Předmět: Odpovědět s citátem

Dik za starost o nase oci. Smile 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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Juraj



Založen: 06. 12. 2007
Příspěvky: 189

PříspěvekZaslal: 11. srpen 2009, 20:31:03    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Juraj



Založen: 06. 12. 2007
Příspěvky: 189

PříspěvekZaslal: 12. srpen 2009, 12:50:09    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Deluxe



Založen: 31. 07. 2007
Příspěvky: 235
Bydliště: Oslavany

PříspěvekZaslal: 12. srpen 2009, 13:09:27    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Augi



Založen: 28. 07. 2007
Příspěvky: 782
Bydliště: Čerčany

PříspěvekZaslal: 12. srpen 2009, 13:14:57    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Juraj



Založen: 06. 12. 2007
Příspěvky: 189

PříspěvekZaslal: 12. srpen 2009, 13:31:34    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Juraj



Založen: 06. 12. 2007
Příspěvky: 189

PříspěvekZaslal: 12. srpen 2009, 13:35:37    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Augi



Založen: 28. 07. 2007
Příspěvky: 782
Bydliště: Čerčany

PříspěvekZaslal: 12. srpen 2009, 13:40:44    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Juraj



Založen: 06. 12. 2007
Příspěvky: 189

PříspěvekZaslal: 12. srpen 2009, 13:45:22    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2, 3  Další
Strana 1 z 3

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna