Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Zelvicek
Založen: 25. 07. 2016 Příspěvky: 3
|
Zaslal: 25. červenec 2016, 12:36:32 Předmět: DX11 shadery - špatný osvit plochy |
|
|
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 |
|
|
satik
Založen: 06. 05. 2010 Příspěvky: 161 Bydliště: Krkonose
|
Zaslal: 26. červenec 2016, 08:06:23 Předmět: |
|
|
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 |
|
|
Zelvicek
Založen: 25. 07. 2016 Příspěvky: 3
|
Zaslal: 26. červenec 2016, 13:34:54 Předmět: |
|
|
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 |
|
|
satik
Založen: 06. 05. 2010 Příspěvky: 161 Bydliště: Krkonose
|
Zaslal: 26. červenec 2016, 14:01:39 Předmět: |
|
|
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 |
|
|
Zelvicek
Založen: 25. 07. 2016 Příspěvky: 3
|
Zaslal: 28. červenec 2016, 07:00:40 Předmět: |
|
|
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 |
|
|
|