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

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

1

11.05.2012, 17:32

Shadowmap

Ich habe eine Frage bezüglich Shadowmapping und Phong-Beleuchtung. Ich habe einen Shader der mir Spotlight, DirLight und Pointlight realisiert. Wenn ich jetzt ein Schatten von einem Licht, beispielsweise Spotlight, haben will, muss ich das berechnen der Shadowmap in den Beleuchtungshader integrieren? Wenn nicht wie geht das dann? Im Sample von DirectX ist der Shadowmap Shader gleichzeitig auch der Beleuchtungshader, wenn ich das richtig verstanden habe.
Danke.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

2

11.05.2012, 17:39

Du musst unterscheiden:
  1. Es gibt einen Shader zum rendern der Shadowmap (Das sollte ein anderer sein)
  2. Es gibt einen Shader zum rendern auf den Bildschirm

Zweiterer muss natürlich auch die Shadowmap berücksichtigen um an der Stelle eben keine Beleuchtung hinzuzeichnen.

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

3

11.05.2012, 17:40

Nein, das erstellen der Shadowmap ist extra Renderpass. Du zeichnest die ganze Szene aus der Sicht deines Spotlights um sie dann aus der Sicht deiner Kamera noch mal zu zeichnen.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

4

11.05.2012, 17:49

Danke für die schnelle Hilfe! Also man rendert die Tiefenmap aus der Sicht der Lichtquelle. Dann nimmt man einen anderen Shader der die Shadowmap mit der Scene kombiniert. Im Smaple von DirectX steht unter dem Pixelshader zum rendern auf dem Bildschirm:

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
float4 PixScene( float2 Tex : TEXCOORD0,
                 float4 vPos : TEXCOORD1,
                 float3 vNormal : TEXCOORD2,
                 float4 vPosLight : TEXCOORD3 ) : COLOR
{
    float4 Diffuse;

    // vLight is the unit vector from the light to this pixel
    float3 vLight = normalize( float3( vPos - g_vLightPos ) );

    // Compute diffuse from the light
    if( dot( vLight, g_vLightDir ) > g_fCosTheta ) // Light must face the pixel (within Theta)
    {
        // Pixel is in lit area. Find out if it's
        // in shadow using 2x2 percentage closest filtering

        //transform from RT space to texture space.
        float2 ShadowTexC = 0.5 * vPosLight.xy / vPosLight.w + float2( 0.5, 0.5 );
        ShadowTexC.y = 1.0f - ShadowTexC.y;

        // transform to texel space
        float2 texelpos = SMAP_SIZE * ShadowTexC;
        
        // Determine the lerp amounts           
        float2 lerps = frac( texelpos );

        //read in bilerp stamp, doing the shadow checks
        float sourcevals[4];
        sourcevals[0] = (tex2D( g_samShadow, ShadowTexC ) + SHADOW_EPSILON < vPosLight.z / vPosLight.w)? 0.0f: 1.0f;  
        sourcevals[1] = (tex2D( g_samShadow, ShadowTexC + float2(1.0/SMAP_SIZE, 0) ) + SHADOW_EPSILON < vPosLight.z / vPosLight.w)? 0.0f: 1.0f;  
        sourcevals[2] = (tex2D( g_samShadow, ShadowTexC + float2(0, 1.0/SMAP_SIZE) ) + SHADOW_EPSILON < vPosLight.z / vPosLight.w)? 0.0f: 1.0f;  
        sourcevals[3] = (tex2D( g_samShadow, ShadowTexC + float2(1.0/SMAP_SIZE, 1.0/SMAP_SIZE) ) + SHADOW_EPSILON < vPosLight.z / vPosLight.w)? 0.0f: 1.0f;  
        
        // lerp between the shadow values to calculate our light amount
        float LightAmount = lerp( lerp( sourcevals[0], sourcevals[1], lerps.x ),
                                  lerp( sourcevals[2], sourcevals[3], lerps.x ),
                                  lerps.y );
        // Light it
        Diffuse = ( saturate( dot( -vLight, normalize( vNormal ) ) ) * LightAmount * ( 1 - g_vLightAmbient ) + g_vLightAmbient )
                  * g_vMaterial;
    } else
    {
        Diffuse = g_vLightAmbient * g_vMaterial;
    }

    return tex2D( g_samScene, Tex ) * Diffuse;
}

Bedeutet das, dass ich einfach nur den Shadowmap Shader zum rendern der Map und den Shader zum rendern auf den Bildschirm nach meinem Beleuchtungshader benutzen muss?
Danke.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

5

13.05.2012, 14:27

So Shadowmapping funktioniert nun. Jetzt nochmal die Frage: Wie kann ich meinen Beleuchtungs-Shader mit der Shadowmap verwenden? Das Ziel ist ein Spotlight was Schatten wirft, und ein Punktlicht was kein Schatten wirft. Ich dachte jetzt erst mal alles mit Schatten rendern und dann als 2. Pass die Beleuchtung des Punktlichtes drüber. Wie sehen dann die Blendfaktoren aus? Wie funktioniert es, dass ich ein Spotlight mit Phong-Shading mache und mit dem Schadowmap-Shader schattiere?
Danke

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

6

13.05.2012, 15:37

Ich weiß nicht as du immer mit deinem Multipass hast.
Aufaddieren ist das Stichwort.

Wo liegt das Problem, dass alles in einem Shader zu machen?

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

7

13.05.2012, 15:46

Mein Problem ist nur, dass ich gerade extrem auf der Leitung stehe^^ Also du meinst, dass man die Phong-Berechnung einfach mit in den Shader schreiben kann, der die Shadowmap auf die Szene legt? Quasi die fertige Szene mit Schatten nochmal manipulieren und einfach zu jedem Texel den Lichtwert hinzuzählen? Habe ich das so richtig verstanden? :D
Danke :vain:
EDIT: Ich glaube ich habe die Antwort beim Formulieren der Frage gefunden *Nice* xD

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Werbeanzeige

Ähnliche Themen