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

1

20.05.2005, 11:53

Per-Pixel-Lighting in HLSL! Hilfeeee!

Ich versuche gerade ganz simples Per-Pixel-Lighting in HLSL umzusetzen.
Ohne Texturen und mit Richtungslicht. Das Dumme ist nur, dass es aussieht wie Per-Vertex-Lighting, obwohl ich nicht die Farbe, sondern die Normale interpoliere!
Hier mal der gesamte Effek-Code aus EffectEdit:

C-/C++-Quelltext

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
//das Model

string XFile = "misc\\sphere0.x";   // "tiger\\tiger.x" eignet sich noch besser

 // Background Color

DWORD  BCLR = 0xffd0a060;

float4x4 WorldViewProj : WORLDVIEWPROJECTION; 
float4x4 WorldView : WORLDVIEW;

//Lichtrichtung im ViewSpace

float3 lightDir <  string UIDirectional = "Light Direction"; > = {0.577, -0.577, 0.577};

//Farbe des texturlosen Models

float4 objcolor = {0.3,0.3,1.0,0.0};
             
//Aus dem Programm in den Vertexshader

struct a2v
{
        float4 position : POSITION0;    
        float3 n        : NORMAL;
        float3 b        : BINORMAL;       
        float3 t        : TANGENT;
};
       
//Aus dem Vertexshader zum Pixelshader

struct v2p
{
        float4 position : POSITION0;
        float3 normal : TEXCOORD0;
};
       
//Aus dem Pixelshader in den Bildspeicher

struct p2f
{
        float4 color : COLOR0;
};
       
//VERTEX SHADER

void vs( in a2v IN, out v2p OUT )
{
      //Finale VertexPositionen:

      OUT.position = mul(IN.position, WorldViewProj);   
      //Die Normale muss wie das Licht in den ViewSpace:

      OUT.normal = mul( IN.n, WorldView ) ;  
}
       
//PIXEL SHADER

void ps( in v2p IN, out p2f OUT )
{         
      //Punktprodukt aus der (scheinbar falsch interpolierten) Normale

      //und dem Lichvektor. Saturate, damit die Schatten keine negative 

      //Farbwerte besitzen.

      float bump = saturate( dot( normalize(IN.normal), -lightDir ) );
      OUT.color = objcolor * bump * 2.7f;
}
       
technique test
{
     pass p0
     {    
          ZEnable = TRUE;      
          vertexshader = compile vs_2_0 vs();
          pixelshader = compile ps_2_0 ps();
     }
}


Bitte helft mir! Wieso sieht es aus wie Vertex-Lighting???

Neva

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

20.05.2005, 12:15

Nimm mal folgenden Fall, dann wirst Du sehen, dass es richtig ist:

Quellcode

1
2
3
4
5
6
7
1----------2
|          |
|          |
|          |
|          |
|          |
4----------3


Also ein Viereck, von vorne gesehen (z zeigt in die Tiefe).
Die Normalenvektoren der Vertizes:

1: normalize(-1, 1, -1)
2: normalize(1, 1, -1)
3: normalize(1, -1, -1)
4: normalize(-1, -1, -1)

Jetzt lässt Du das Richtungslicht frontal drauf scheinen (also Richtung: (0, 0, 1)).

Bei Vertex-Beleuchtung wäre das gesamte Viereck gleichmäßig ausgeleuchtet. Bei Pixel-Beleuchtung müsste es in der Mitte 100% Beleuchtung haben, da dort die interpolierte normalisierte Normale (0, 0, -1) ergibt.

Also keine Panik, klar? :)

Die richtigen Vorteile von Per-Pixel-Beleuchtung bekommst Du eh erst beim Einsatz von Normal-Mapping und Point-Lights zu spüren.

3

20.05.2005, 13:04

Danke für die flotte Antwort.

Werbeanzeige