2 registered members (AndrewAMD, 7th_zorro),
1,285
guests, and 4
spiders. |
Key:
Admin,
Global Mod,
Mod
|
|
|
Beleuchtungsrichtung bei einem Normalmapping Shader
#368296
04/23/11 21:24
04/23/11 21:24
|
Joined: Jan 2011
Posts: 797 Da wo du nicht bist! Muhahaha!
xxxxxxx
OP
User
|
OP
User
Joined: Jan 2011
Posts: 797
Da wo du nicht bist! Muhahaha!
|
Hi, meine alten verhassten Shader mal wieder... ich will gar nicht wissen wie man mich für diese frage verkloppen wirdAlso ich wollte neulich mal den Normalmapping-Shader aus dem Shader Tutorial auf 8 Lichter umschreiben, 8 Lichter sind jetzt mehr oder weniger gut untergebracht. NUR die Beleuchtungsrichtung passt nicht richtig das ganze sieht so auf dem modell(nur der Kopf das andere zeug benutzt einen anderen Normal-Mappingshader, der auf dem Kopf nicht gut aussieht) aus: ja die hachfresse ist beabsichtigt so berechne ich die richtungen(im vertex shader)
OutLightDir0 = normalize(mul(matTangent, vecLightPos[0]-InPos.xyz));
und so wende ich sie im(pixel shader)
Diffuse[0] = DiffuseIntensity * saturate(dot(InLightDir0, BumpNormal));
Diffuse[0] *= vecLightColor[0];
R = normalize(2 * dot(BumpNormal, InLightDir0) * BumpNormal - InLightDir0);
InViewDir = normalize(InViewDir);
Specular[0] = pow(saturate(dot(R, InViewDir)), SpecularPower) * SpecularIntensity;
...
...
...
float4 Color = tex2D(ColorMapSampler, InTex);
return (Ambient + Diffuse[0] + Specular[0]) * Color;
wer sich jetzt fragt was wie zusammen hängt hier der ganze shader:
static const float AmbientIntensity = 1.0f;
static const float DiffuseIntensity = 1.0f;
static const float SpecularIntensity = 1.0f;
static const float SpecularPower = 9.0f;
float4x4 matWorldViewProj;
float4x4 matWorld;
float4 vecAmbient;
float4 vecViewPos;
float4 vecLightColor[8];
float4 vecLightPos[8];
float3x3 matTangent;
texture entSkin1;
sampler ColorMapSampler = sampler_state
{
Texture = <entSkin1>;
MipFilter = LINEAR;
};
texture entSkin2;
sampler NormalMapSampler = sampler_state
{
Texture = <entSkin2>;
MipFilter = NONE;
};
void NormalMapVS( in float4 InPos : POSITION,
in float3 InNormal : NORMAL,
in float2 InTex : TEXCOORD0,
in float4 InTangent : TEXCOORD2,
out float4 OutPos : POSITION,
out float2 OutTex : TEXCOORD0,
out float3 OutViewDir: TEXCOORD1,
out float3 OutLightDir0: TEXCOORD2,)
{
OutPos = mul(InPos, matWorldViewProj);
OutTex = InTex;
matTangent[0] = mul(InTangent.xyz, matWorld);
matTangent[1] = mul(cross(InTangent.xyz,InNormal)*InTangent.w, matWorld);
matTangent[2] = mul(InNormal, matWorld);
OutViewDir = normalize(mul(matTangent, vecViewPos - mul(InPos, matWorld)));
OutLightDir0 = normalize(mul(matTangent, vecLightPos[0]-InPos.xyz));
}
float4 NormalMapPS( in float2 InTex : TEXCOORD0, in float3 InViewDir : TEXCOORD1, in float3 inPos : TEXCOORD3,
in float3 InLightDir0 : TEXCOORD4) : COLOR
{
float3 BumpNormal = 2 * tex2D(NormalMapSampler, InTex) - 1;
float4 Ambient = AmbientIntensity * vecAmbient;
float4 Diffuse[8];
float Specular[8];
float3 R;
Diffuse[0] = DiffuseIntensity * saturate(dot(InLightDir0, BumpNormal));
Diffuse[0] *= vecLightColor[0];
R = normalize(2 * dot(BumpNormal, InLightDir0) * BumpNormal - InLightDir0);
InViewDir = normalize(InViewDir);
Specular[0] = pow(saturate(dot(R, InViewDir)), SpecularPower) * SpecularIntensity;
float4 Color = tex2D(ColorMapSampler, InTex);
return (Ambient + Diffuse[0] + Specular[0]) * Color;
}
technique SpecularTechnique
{
pass P0
{
VertexShader = compile vs_3_0 NormalMapVS();
PixelShader = compile ps_3_0 NormalMapPS();
}
}
und es ist das ganze nur für 8 lichter, ich hab den shader entsprechend gekürzt, damit er nicht solang ist... xxxxxxx
Es ist immer wieder erstaunlich, dass Leute die riesen Scripte schreiben die einfachsten sachen nicht können zb. mich mit SIEBEN x zu schreiben!
|
|
|
Re: Beleuchtungsrichtung bei einem Normalmapping Shader
[Re: xxxxxxx]
#368343
04/24/11 11:44
04/24/11 11:44
|
Joined: May 2005
Posts: 2,713 Lübeck
Slin
Expert
|
Expert
Joined: May 2005
Posts: 2,713
Lübeck
|
Dein inPos bei der Berechnung der Lichtrichtung ist im Objectspace, die Lichtposition aber im Worldspace. Bei der Viewrichtung machst du es korrekt, da soeine Matrixmultiplikation allerdings nicht grad billig ist, solltest du die Transformation der Vertexposition nur einmal machen. Statt phong-shading, kann ich dir auch blinn-phong empfehlen, da es besser aussieht und schneller läuft. Dazu must du nur die specularity etwas abändern. Wenn du die Viewdir im Pixelshader normalisierst, musst du sie nicht auch noch im Vertexshader normalisieren. Im Pixelshader zu normalisieren ist korrekter, ist aber natürlich lagsamer als im Vertexshader. Da solltest du mal ausprobieren wie sehr sich das aufs Ergebniss auswirkt. Eventuell machts auch Sinn die Normale zu normalisieren, je nach Auflösung der Normalmap.
|
|
|
Re: Beleuchtungsrichtung bei einem Normalmapping Shader
[Re: Slin]
#368373
04/24/11 18:59
04/24/11 18:59
|
Joined: Jan 2011
Posts: 797 Da wo du nicht bist! Muhahaha!
xxxxxxx
OP
User
|
OP
User
Joined: Jan 2011
Posts: 797
Da wo du nicht bist! Muhahaha!
|
ich schaffs immer noch nicht... so siehts jetzt aus(ich hab auch schon mehrfach die vectoren umgedreht usw.):
OutLightDir0 = normalize(mul(matTangent, -(vecLightPos[0]-mul(InPos, matWorld))));
und so sieht das modell aus: xxxxxxx
Es ist immer wieder erstaunlich, dass Leute die riesen Scripte schreiben die einfachsten sachen nicht können zb. mich mit SIEBEN x zu schreiben!
|
|
|
Re: Beleuchtungsrichtung bei einem Normalmapping Shader
[Re: xxxxxxx]
#368678
04/27/11 15:21
04/27/11 15:21
|
Joined: Jan 2011
Posts: 797 Da wo du nicht bist! Muhahaha!
xxxxxxx
OP
User
|
OP
User
Joined: Jan 2011
Posts: 797
Da wo du nicht bist! Muhahaha!
|
So hab jetzt den anderen Shader genommen abgesehen davon das die haare von einem bestimmten blickwinkel grau erscheinen(der grund warum ich diesen shader vorher nicht verwendet habe) sieht er doch ganz gut aus, ist halt gewöhnugsbedürftig... xxxxxxx
Es ist immer wieder erstaunlich, dass Leute die riesen Scripte schreiben die einfachsten sachen nicht können zb. mich mit SIEBEN x zu schreiben!
|
|
|
|