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

Založen: 31. 07. 2007 Příspěvky: 235 Bydliště: Oslavany
|
Zaslal: 12. srpen 2009, 13:48:48 Předmět: |
|
|
Augi: Pokud ma smner svetla [0,0,1] a teren je kolmej na Y (pise ze teren je [0,vyska,0] - [257, vyska, 257]) a pise ze pri tomhle nastaveni to ma osvetleny vsude, tak je neco asi celkem blbe nemyslis? Akorat ja netusim co.
Juraj: nemas ten teren otocenej pomoci World matice?
btw.: jeste mne napdada, zkus pomoci shaderu vykreslit hodnoty normal terenu a poslat screen. |
|
Návrat nahoru |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 12. srpen 2009, 13:57:04 Předmět: |
|
|
Deluxe napsal: |
Augi: Pokud ma smner svetla [0,0,1] a teren je kolmej na Y (pise ze teren je [0,vyska,0] - [257, vyska, 257]) a pise ze pri tomhle nastaveni to ma osvetleny vsude, tak je neco asi celkem blbe nemyslis? Akorat ja netusim co.
Juraj: nemas ten teren otocenej pomoci World matice?
btw.: jeste mne napdada, zkus pomoci shaderu vykreslit hodnoty normal terenu a poslat screen. |
- ne nemám to otočenépomocí world matice
- jak mam vykreslit hodnoty normal? |
|
Návrat nahoru |
|
 |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 12. srpen 2009, 14:00:24 Předmět: |
|
|
Deluxe: Tu informaci zde uvedl až na moje vyžádání
Každopádně terén orientovanej ve směru Y a světlo směru [0, 0, 1] by nemělo dávat plné osvětlení.
Jak píše Deluxe, zkus použít normály jako barvu a pošli screenshot. Pak ještě zkus použít PSIn.LightDirection jako barvu a taky pošli screenshot.
Dvě věci, které mě ještě zarazily v Tvém kódu (ta první je vážně divná, druhá je snad ok:
kód: |
Output.Normal = mul(-inNormal, gWorld); |
Proč to mínus?
kód: |
Output.Color.rgb *= lightingFactor; |
Zkus xyz místo rgb (to by nemělo vadit, ale člověk nikdy neví). |
|
Návrat nahoru |
|
 |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 12. srpen 2009, 14:02:00 Předmět: |
|
|
Juraj napsal: |
- jak mam vykreslit hodnoty normal? |
kód: |
Output.Color = PSIn.Normal; |
|
|
Návrat nahoru |
|
 |
Deluxe

Založen: 31. 07. 2007 Příspěvky: 235 Bydliště: Oslavany
|
Zaslal: 12. srpen 2009, 14:06:51 Předmět: |
|
|
akorat dej Output.Color = float4(abs(PSIn.Normal.xyz), 1.0);
a kdyztak to zkus i bez Abs, dej ho tam pokud ten teren bude tmavej/cernej |
|
Návrat nahoru |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 12. srpen 2009, 14:18:51 Předmět: |
|
|
Dávám sem aktualizovaný kód sharderu
kód: |
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.Normal = mul(normalize(inNormal), gWorld);
Output.Normal = mul(inNormal, gWorld);
Output.LightDirection.xyz = xLightDirection;
Output.LightDirection.w = 1;
return Output;
}
PixelToFrame Terrain_TexPS(VertexToPixel PSIn)
{
PixelToFrame Output = (PixelToFrame)0;
float lightingFactor = 1;
if (xEnableLighting)
lightingFactor = saturate(saturate(dot(PSIn.Normal, PSIn.LightDirection)) + xAmbient);
//PSIn.Normal = normalize(PSIn.Normal);
PSIn.LightDirection = normalize(PSIn.LightDirection);
lightingFactor = saturate(saturate(dot(PSIn.Normal, PSIn.LightDirection)) + xAmbient);
Output.Color = tex2D(LayerMap0Sampler, PSIn.TextureCoords );
Output.Color.xyz *= lightingFactor;
Output.Color = float4(PSIn.Normal.xyz, 1.0);
return Output;
}
|
Dále image při Output.Color = float4(abs(PSIn.Normal.xyz), 1.0);
Dále image při Output.Color = float4(PSIn.Normal.xyz, 1.0);
 |
|
Návrat nahoru |
|
 |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 12. srpen 2009, 15:04:26 Předmět: |
|
|
No pokud máš terén orientovaný tak, že nahoru je osa Y, tak bych čekal, že normály na rovinách budou zelené (RGB), ale u Tebe se mi zdají spíš být červené, takže možná není něco v pořádku s výpočtem normál. Koukám teď na Tvůj první příspěvek, kde ukazuješ, jak počítáš normály, a moc se mi to nezdá (třeba ta konstanta 2.0f natvrdo nasazená do vektoru je divná). Zkus třeba toto: http://www.flipcode.com/archives/Calculating_Vertex_Normals_for_Height_Maps.shtml
Kdyžtak zkus dodat ty samý screenshoty pro ten lightingFactor. |
|
Návrat nahoru |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 12. srpen 2009, 18:28:21 Předmět: |
|
|
Hurá našel jsem to, měl jsem chybu trochu jinde než jsem jí hledal. Ale když jsem se na terén podle Augiho rady snažil dotat zelenou (všechny normály jsem nastavil na 0,1,0) zjistil jsem, že se mi to do sharderu přenáši jinak/zdeformovaně. Nakonec jsem měl chybu v deklaraci Vertexu u normály kde jsem místo [sizeof(float) * 3] měl [sizeof(float) * 4]
Nyní mám ale ještě jeden dotaz, když nastavím světlo na 0,1,0 a výšku na 0, vše je osvícené, to je správně, ale pokud nastavím výšku v rozmezí 0-400 (podle mapy), mají být na bocích skal stíny, nebo ne?
Mám tu totiž 2 algoritmy na výpočet normál a jeden to tak udělá, druhý ne.
konkrétně
alg1 světlo vžy a všude:
kód: |
int xPomMin, yPomMin, xPomMax, yPomMax;
xPomMin = x;
yPomMin = y;
xPomMax = x;
yPomMax = y;
if (xPomMin > 0) { xPomMin = x - 1; }
if (yPomMin > 0) { yPomMin = y - 1; }
if (xPomMax < (width - 1)) { xPomMax = x + 1; }
if (yPomMax < (height - 1)) { yPomMax = y + 1; }
float sx = heights[xPomMax, y] - heights[xPomMin, y];
if (x == 0 || x == width - 1)
sx *= 2;
float sy = heights[x, yPomMax] - heights[x, yPomMin];
if (y == 0 || y == height - 1)
sy *= 2;
vertices[v].Normal = new Vector3(sx * scale, 2 * scaleHeight, sy * scale);
vertices[v].Normal.Normalize();
|
alg2 stíny na bocích vysokýchh skal
kód: |
int xPomMin, yPomMin, xPomMax, yPomMax;
xPomMin = x - 1;
yPomMin = y - 1;
xPomMax = x + 1;
yPomMax = y + 1;
if (xPomMin < 0) { xPomMin = x; }
if (yPomMin < 0) { yPomMin = y; }
if (xPomMax == width) { xPomMax = x; }
if (yPomMax == height) { yPomMax = y; }
Vector3 v1 = new Vector3(2.0F * this.scale, (heights[xPomMax, y] - heights[xPomMin, y]), 0.0F);
Vector3 v2 = new Vector3(0.0f, (heights[x, yPomMax] - heights[x, yPomMin]), 2.0f * this.scale);
vertices[v].Normal = Vector3.Cross(v2, v1);
vertices[v].Normal.Normalize();
|
|
|
Návrat nahoru |
|
 |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 12. srpen 2009, 20:13:55 Předmět: |
|
|
A zkoušels ten algoritmus, na který jsem pastoval link? |
|
Návrat nahoru |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 12. srpen 2009, 21:20:48 Předmět: |
|
|
Augi napsal: |
A zkoušels ten algoritmus, na který jsem pastoval link? |
Jasně to je alg1, když zvednu hory tak světlo je pořád všude.. |
|
Návrat nahoru |
|
 |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 13. srpen 2009, 06:36:00 Předmět: |
|
|
Máš tam obráceně znamínko u složky X. Ale to problém asi neřeší. Zkus udělat screenshot s normalizovanýma normálama a taky screenshot s výsledkem osvětlovací rovnice... |
|
Návrat nahoru |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 13. srpen 2009, 07:23:07 Předmět: |
|
|
Augi napsal: |
Máš tam obráceně znamínko u složky X. Ale to problém asi neřeší. Zkus udělat screenshot s normalizovanýma normálama a taky screenshot s výsledkem osvětlovací rovnice... |
Augi napsal: |
Máš tam obráceně znamínko u složky X. Ale to problém asi neřeší. Zkus udělat screenshot s normalizovanýma normálama a taky screenshot s výsledkem osvětlovací rovnice... |
Tak jakmile jsem si udělal screeny podle normál, řekl bych že dobře je algoritmus 2. Pro jistotu to sem taky dám..
Alg1
kód: |
vertices[v].Normal = new Vector3(-sx * scale, 2 * scaleHeight, sy * scale); |
Alg1
kód: |
vertices[v].Normal = new Vector3(-sx * scaleHeight, 2 * scale, sy * scaleHeight); |
Alg2
 |
|
Návrat nahoru |
|
 |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 13. srpen 2009, 08:25:53 Předmět: |
|
|
Tak dejme tomu, že normály jsou dobře (možná bych pro jistotu zkusil v PS normálu před použitím normalizovat).
A jak by vypadal screenshot, který by ukazoval ten výsledek osvětlovací rovnice?
kód: |
Output.Color = float4(lightingFactor, lightingFactor, lightingFactor, 1.0); |
|
|
Návrat nahoru |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 13. srpen 2009, 09:15:01 Předmět: |
|
|
Augi napsal: |
Tak dejme tomu, že normály jsou dobře (možná bych pro jistotu zkusil v PS normálu před použitím normalizovat).
A jak by vypadal screenshot, který by ukazoval ten výsledek osvětlovací rovnice?
kód: |
Output.Color = float4(lightingFactor, lightingFactor, lightingFactor, 1.0); |
|
Augi napsal: |
Tak dejme tomu, že normály jsou dobře (možná bych pro jistotu zkusil v PS normálu před použitím normalizovat).
A jak by vypadal screenshot, který by ukazoval ten výsledek osvětlovací rovnice?
kód: |
Output.Color = float4(lightingFactor, lightingFactor, lightingFactor, 1.0); |
|
Alg1 v1
kód: |
vertices[v].Normal = new Vector3(-sx * scale, 2 * scaleHeight, sy * scale); |
Alg1 v2
kód: |
vertices[v].Normal = new Vector3(-sx * scaleHeight, 2 * scale, sy * scaleHeight); |
Alg2
Jaký algoritmus je tedy správně, pokud je nějaký??
ps: světlo je nastaveno na 0,1,0 |
|
Návrat nahoru |
|
 |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 13. srpen 2009, 09:27:10 Předmět: |
|
|
Zcela jistě ten poslední. Normály i výsledek osvětlení se zdá být ok. Když tím výsledkem osvětlení pronásobíš barvu textury, tak to nedává správné výsledky? |
|
Návrat nahoru |
|
 |
|