Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Phili

unregistriert

1

29.10.2006, 17:48

Shader spinnt fröhlich vor sich hin...

hallo,
ich hab nen Problemchen mit nem Normal-Mapping Shader. Auf den erstem Blick funktioniert er zwar, aber sobald irgendwas abderes Dargestellt werden soll, als ne Ebene, scheint mir die Beleuchtung doch etwas eigenartig... :?

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
TEXTURE Bitmap;
TEXTURE Specmap;
TEXTURE Bumpmap;

struct InVertex 
{
 float4 Position : POSITION;
 float2 Texture  : TEXCOORD0;
 float3 TanU     : TEXCOORD1;
 float3 TanV     : TEXCOORD2;
 float3 TanW     : TEXCOORD3;

 float4 Licht    : TEXCOORD4;
 float4 Kamera   : TEXCOORD5;
};

sampler Bitmapsamp = sampler_state
{
 Texture=<Bitmap>;
 AdressU=Wrap;
 AdressV=Wrap;
 MipFilter=Linear;
 MinFilter=Linear;
 MagFilter=Linear;
};
sampler Specmapsamp = sampler_state
{
 Texture=<Specmap>;
 AdressU=Wrap;
 AdressV=Wrap;
 MipFilter=Linear;
 MinFilter=Linear;
 MagFilter=Linear;
};
sampler Bumpsamp = sampler_state
{
 Texture=<Bumpmap>;
 AdressU=Wrap;
 AdressV=Wrap;
 MipFilter=Linear;
 MinFilter=Linear;
 MagFilter=Linear;
};
float4x4 View           : register(c0);
float4x4 Projection     : register(c4);
float4x4 Transformation : register(c8);
float4x4 TransformInvers: register(c12);
float4 KameraPosition   : register(c16);
float Time              : register(c17);
float4 LichtPosition    : register(c19);
float4 LichtDiffus      : register(c20);
float4 LichtAmbient     : register(c21);
float  LichtAbnahme     : register(c22);

float3 BumpMapTransform(float3 TanU, float3 TanV, float3 TanW, float3 V)
{ 
 float3 R;
 V[0]=0.5-V[0];
 V[1]=0.5-V[1];
 V=normalize(V);
 R[0]=V[0]*TanU[0]+V[1]*TanV[0]+V[2]*TanW[0];
 R[1]=V[0]*TanU[1]+V[1]*TanV[1]+V[2]*TanW[1];
 R[2]=V[0]*TanU[2]+V[1]*TanV[2]+V[2]*TanW[2];
 return R;
}


float4 main(InVertex In) : COLOR 
{
 float3 Norm=BumpMapTransform(In.TanU, In.TanV, In.TanW, tex2D(Bumpsamp, In.Texture));
 float3 Licht=normalize(In.Licht);
 float3 Kam=normalize(In.Kamera);
 float Winkel=dot(Norm, Licht); 
 float Reflection=dot(reflect(-Licht, Norm), Kam); if(Reflection<0) Reflection=0;

 float4 Diffus=Winkel*LichtDiffus*tex2D(Bitmapsamp, In.Texture);
 float4 Ambient=LichtAmbient*tex2D(Bitmapsamp, In.Texture);
 float4 Specular=pow(Reflection, 50)*LichtDiffus*tex2D(Specmapsamp, In.Texture)*3;

 float Abnahme=LichtAbnahme*sqrt(In.Licht[0]*In.Licht[0]+In.Licht[1]*In.Licht[1]+In.Licht[2]*In.Licht[2]);
 Abnahme=1-Abnahme;
 if(Abnahme<0)Abnahme=0;

 float4 Beleuchtung=(Diffus+Ambient+Specular)*Abnahme;
 
 return Beleuchtung; 
}

Ich hab das ganze jetzt ncith irgendwie nach nem Tutorial gemacht, sondern einfach nen bisschen rumprobiert, deswegen kanns durchaus auch sein, dass einfach irgendwas Grundlegendes falsch ist...

das Problem ist, dass ganz offensichtlich direkt angestrahlte Fl#ächen schwarz oder zumindest dunkel sind und manchmal auch garnicht erkennbar ist, dass eine Normalmap vorhanden ist. An anderen Stellen(am Boden) wird hingegen alles perfekt dargestellt, genau wie ichs mir wünsche...
:?

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

2

29.10.2006, 20:33

Für welches SM compilierst Du?

C-/C++-Quelltext

1
2
 V[0]=0.5-V[0];
 V[1]=0.5-V[1];

sieht grottenfalsch aus

Überleg Dir bei jeder berechnung in welchem Koordinatensystem die Vektoren sind und m.E: wirst Du mindestens einen fehler finden.

Ambient nimmt ab?!?

Dein Fehler hört sich an als ob Du die "handedness" nicht berücksichtigst ;) , dann siehts so aus:
http://www.emuload.de/gieskanne/uploads/sven/fatty_tangenten_fehler.png
"Games are algorithmic entertainment."

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

29.10.2006, 22:57

Quellcode

1
2
 V[0]=0.5-V[0]; 
 V[1]=0.5-V[1];


das soll deine normalen aus der normal map vermutlich vom 0..1 bereich in den -1..1 bereich bringen!?

ich würd *2 und -1 empfehlen ;)

Quellcode

1
2
3
 R[0]=V[0]*TanU[0]+V[1]*TanV[0]+V[2]*TanW[0]; 
 R[1]=V[0]*TanU[1]+V[1]*TanV[1]+V[2]*TanW[1]; 
 R[2]=V[0]*TanU[2]+V[1]*TanV[2]+V[2]*TanW[2];


außerdem dürfte es um einiges schneller sein, das licht im vertex shader IN den tangent space zu transformieren (dazu kannst du einfach die transponierte nehmen, da die tangentspace matrix hoffentlich orthogonal ist), anstatt die normalen jedes pixels AUS dem tangent space...

Phili

unregistriert

4

30.10.2006, 10:53

@dot

Zitat

das soll deine normalen aus der normal map vermutlich vom 0..1 bereich in den -1..1 bereich bringen!?

Ja, so ungefähr hab ich mir das vorgestellt...
Baer wie gesagt, ich hab einfach rumprobiert. Und als dann der Boden perfekt dargestellt wurde, dachte ich :"super, ich habs". War aber leider auch nur beim Boden so...

Zitat


außerdem dürfte es um einiges schneller sein, das licht im vertex shader IN den tangent space zu transformieren (dazu kannst du einfach die transponierte nehmen, da die tangentspace matrix hoffentlich orthogonal ist), anstatt die normalen jedes pixels AUS dem tangent space...

Klar, das kommt noc hin den Vertex Shader. Dass ich außerdem noch in die falsche Richtung transformier wär mit garnicht aufgefallen... :oops:

@Osram

Zitat

sieht grottenfalsch aus

Das stimmt wohl :oops:

Zitat


Ambient nimmt ab?!?

Das ist schon gewollt, ist ja ncith das allgemeine Ambient Licht, sondern das von der Lichtquelle... nen allgemeinen hab ich allerdings auch garnciht ;-)

Ok, ich werd mal sehen, ob mir das ganze weiterhilft..

Phili

unregistriert

5

30.10.2006, 11:31

hmm, naja, also, ich glaub Grottenfalsch isses nciht,. Ich habs jetzt nochmal ein bisschen überarbeitet. Ich hab auch nen Screenshot gemacht, da sieht man das Problem vieleicht.
http://img182.imageshack.us/my.php?image=screenxp0.png
Die Beleuchtung ist ncith völlig falsch(siehe z.B. Boden), aber stimmen tut sie bestimmt nciht.
Ich werd mal nach "handedness" googeln...

//Edit
@Osram
Was ist handedness? :oops:

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

30.10.2006, 12:50

Quellcode

1
V[0] = 2.0f * V[0] - 1.0f;


umwandeln eher so ;)
ob du das nur für x und y oder auch für z machen musst, hängt davon ab wie die normalmap erstellt wurde...


Zitat

Was ist handedness?


^^ hast du dich nie gefragt, warum es D3DXMatrixPerspectiveLH() heißt?

LH = Left Handed

D3D verwendet ein sog linkshändiges koordinatensystem, was im prinzip bedeutet, dass die z achse in den bildschirm hinein geht.
das ganze leitet sich von der linke/rechte hand regel ab, die dir sicher schonmal untergekommen ist (z.b. im zusammenhang mit dem kreuzprodukt von vektoren, "korkenzieherregel")


Quellcode

1
float4 Beleuchtung=(Diffus+Ambient+Specular)*Abnahme;


wenn ich mir das so anschaue, dann seh ich aber auch, dass ambient abnimmt...

Phili

unregistriert

7

30.10.2006, 12:55

@dot

Zitat


Dein Fehler hört sich an als ob Du die "handedness" nicht berücksichtigst Wink , dann siehts so aus:

Was heißt "handedness" in dem Zusammenhang, dass meinte ich.

Zitat


wenn ich mir das so anschaue, dann seh ich aber auch, dass ambient abnimmt...

Wie gesagt, ist gewollt.

Zitat

V[0] = 2.0f * V[0] - 1.0f;

Hab ich inzwischen drinnen. Sieht aber immer noch so aus wie auf dem Bild.

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

8

30.10.2006, 14:15

In diesem Fall geht es um den Tangentenraum (also durch U V und N aufgespannt), der innerhalb eines Objektes oft an manchen Eckpunkte LH und an anderen RH ist. In dem "falschen Bild" was ich gelinkt habe kann man die beiden Bereiche ganz gut sehen. Eckpunkte auf der Grenze zwischen den beiden sollten verdoppelt werden da man ja sonst innerhalb eines Dreiecks von links auf rechtshändig springt. Stell Dir z.B. einen Menschen vor und dass Du nur eine hälfte texturierst und ab der anderen die UV Koordinaten spiegelst.
"Games are algorithmic entertainment."

Phili

unregistriert

9

31.10.2006, 14:34

also ic hhab jetzt noc hne ganze Menge rumexperimentiert, so ganz klappts aber immer noch ncith... :? :( . Ich weiß echt nciht, worans liegen könnte(so wie Osrams Bild sieht des Problem nicth aus).
Ich poste jetzt mal nochmal beide Shader, vieleicht sieht einer sofort das Problem...

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
OutVertex main(InVertex In) 
{
 OutVertex Out=(OutVertex)(0);

 Out.Position=mul(In.Position, Transformation);
 Out.Licht=LichtPosition-Out.Position;
 Out.TanU=normalize(mul(In.TanU, TransformInvers));
 Out.TanV=normalize(mul(In.TanV, TransformInvers));
 Out.TanW=normalize(mul(In.TanW, TransformInvers));

 Out.Texture=In.Texture;
 Out.Position=mul(Out.Position, View);
 Out.Position=mul(Out.Position, Projection);
 return Out; 
}


Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
float3 BumpMapTransform(float3 TanU, float3 TanV, float3 TanW, float3 V)
{ 
 float3 R;
 R=V;
 R[0]=R[0]-0.5;
 R[2]=R[2]-0.5;
 float3x3 Trans;
 Trans[0]=normalize(TanU);
 Trans[1]=normalize(TanW);
 Trans[2]=normalize(TanV);
 R=mul(R, Trans);
 return R;
}

float4 main(InVertex In) : COLOR 
{
 float3 Norm=normalize(tex2D(Bumpsamp, In.Texture));
 Norm=BumpMapTransform(In.TanU, In.TanV, In.TanW, Norm);
 float3 Licht=normalize(In.Licht);
 float Winkel=dot(Norm, Licht); 

 float4 Diffus=Winkel*LichtDiffus*tex2D(Bitmapsamp, In.Texture);
 float4 Ambient=LichtAmbient*tex2D(Bitmapsamp, In.Texture);

 float Abnahme=LichtAbnahme*length(In.Licht);
 Abnahme=1-Abnahme;
 if(Abnahme<0)Abnahme=0;

 float4 Beleuchtung=(Diffus+Ambient)*Abnahme;
 return Beleuchtung; 
}


Auf den ersten Blick sieht jetzt eigentlic halles gut aus(ncithmehr so wie am Anfang), aber z.B. ist ne lichtquelle über ner Ebene, die den Boden darstellt. Die beleuchtung ist aber ncith in lle Richtungen gleich stark(wie sie sein sollte) sondern irgendwie nur rechts von der Lichtquelle... ich hoffe jemand weis so halb, was ich meine.

Werbeanzeige