.[ ČeskéHry.cz ].
DX11 shadery - špatný osvit plochy

 
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
Zelvicek



Založen: 25. 07. 2016
Příspěvky: 3

PříspěvekZaslal: 25. červenec 2016, 12:36:32    Předmět: DX11 shadery - špatný osvit plochy Odpovědět s citátem

Zdravím,
jsem v D3D začátečník a mám problém se shadery v DX11.

Předělávám velice jednoduchou (začátečnickou) aplikaci, kterou jsem napsal před pár lety za použití DX8 - bez shaderů. V apce je pár trojúhelníků (plocha) a všesměrové světlo (slunce). Pozice a namíření kamery (pos a target) se dají měnit a taktéž pozice světla.

Teď bych to samé rád udělal v DX11, mám plochu i světlo, pohybuju kamerou v prostoru, ale zdá se, že pozice světla není transformována nějakou maticí a je "přibité" k obrazovce namísto aby se "přeneslo" do světa. Výsledkem je, že pokud pohnu kamerou (pozice či směr), je osvětlena jiná část plochy (přestože se plocha ani světlo nepohli) -> to je trošku neočekávané chování.

CPU část je v C# (SharpDX), GPU je vs_4_0 a ps_4_0.

Náčrt kódu (C#):
projection = Matrix.PerspectiveFovLH((float)Math.PI / 4,(float)_container.Width / _container.Height,.01f,100.0f);
view = Matrix.LookAtLH(cam.position,cam.target,_up); //_up = Vector3.UnitZ;
view = view * projection; //world považuju za Matrix.Identity a tudíž jsem jej zatím vypustil
view.Transpose();

Vertex shader:
cbuffer cbPerObject {
float4x4 gWorldViewProj;
}

struct VOut
{
float4 position : SV_POSITION;
float4 color : COLOR;
};

VOut VShader(float3 position: POSITION,float4 color: COLOR)
{
VOut output;
output.position = mul(float4(position, 1), gWorldViewProj);
output.color=color;
return output;
}

Pixel shader:
//Světlo se má chovat, jako by dopadalo kolmo na pixel, aniž by reflektovalo orientaci trojúhelníku vůči světlu. Je to trošku nelogické, ale snažím se problematiku maximálně zjednodušit. Takže množství dopadajícího světla má záviset jen na vzdálenosti bodu od zdroje světla.
struct PointLight
{
float4x4 gWorldViewProj;
float4 pos;
float4 ambient;
float4 diffuse;
float range;
};

cbuffer cbPerObject {
PointLight gLight;
}

bool VectorsEqual(float3 a, float3 b )
{
return length(a-b)==0;
}

float4 PShader(float4 pos : SV_POSITION, float4 color : COLOR,float3 normal : NORMAL):SV_Target
{
//return color;

float3 light_pos = gLight.pos;
light_pos = (float3)mul(float4(light_pos, 1), gLight.gWorldViewProj);

float4 light_ambient = gLight.ambient; //Ambient = new Color4(.05f,.05f,.05f,1)
float4 light_diffuse = gLight.diffuse; //Diffuse = new Color4(1,1,1,1)
float light_range = 100;//gLight.range;

float distLightVertex = length(light_pos - (float3)pos);

float rate = light_range/distLightVertex;
float3 distanceLightColor = ((float3)light_diffuse) * rate;

float4 finalColor = float4(distanceLightColor,light_diffuse.a) * color;

return finalColor;
}

Nevím, jaké další info je potřeba, takže dodám na vyžádání.

Předem díky
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
satik



Založen: 06. 05. 2010
Příspěvky: 161
Bydliště: Krkonose

PříspěvekZaslal: 26. červenec 2016, 08:06:23    Předmět: Odpovědět s citátem

Musíš tu vzdálenost ke světlu měřit z pozic, které ještě nejsou prohnané projekční maticí (a pozici světla samozřejmě taky - obojí musí být ve stejném prostoru).
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Zelvicek



Založen: 25. 07. 2016
Příspěvky: 3

PříspěvekZaslal: 26. červenec 2016, 13:34:54    Předmět: Odpovědět s citátem

Díky za reakci.

satik napsal:
obojí musí být ve stejném prostoru

To dává smysl.

Ale domnívám se, že to právě dělám. Ve vertex shaderu transformuju pozice vrcholů trojúhelníků a v pixel shaderu transformuju pozici zdroje světla - viz source code v dotazu. Do obou shaderů posílám stejnou transformační matici. Nebo tam mám nějakou logickou botu?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
satik



Založen: 06. 05. 2010
Příspěvky: 161
Bydliště: Krkonose

PříspěvekZaslal: 26. červenec 2016, 14:01:39    Předmět: Odpovědět s citátem

Hlavni je ta prvni cast meho komentu, sice to mas ve stejnem prostoru, ale projekce ten prostor deformuje tak, ze pak uz to pocitani vzdalenosti v nem nedava smysl.

Musis tu vzdalenost ke svetlu pocitat jeste pred nasobenim projekcni matici.
Jestli i pred view uz je celkem fuk.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Zelvicek



Založen: 25. 07. 2016
Příspěvky: 3

PříspěvekZaslal: 28. červenec 2016, 07:00:40    Předmět: Odpovědět s citátem

satik napsal:
Musis tu vzdalenost ke svetlu pocitat jeste pred nasobenim projekcni matici.

Upravil jsem ty shadery, aby počítaly zdálenost před transformací, a je to tak. Kdo umí, umí. Pochopit účel transformačních matic je peklo.

Mockrát díky a páhbůh ti to oplať na dětech.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
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
Strana 1 z 1

 
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