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

16.04.2011, 20:39

2D Shadow - GLSL

Hallo,

für mein aktuelles Projekt hatte ich mir gedacht, dass ich doch mal versuchen könnte 2D Schatten zu implementieren. Ich habe allerdings noch nicht wirklich viel Erfahrung mit glsl bzw. shadern allgemein.
Mein erster (ineffizienter, aber theoretisch einfacher) Gedanke war, von jedem Pixel eine "Linie" im Fragment-Shader zu ziehen und falls diese Linie einen Pixel schneidet, der nicht Alpha = 0 hat, liegt dieser Pixel im Schatten. Alle Objekte die Schatten werfen, habe ich davor in eine Textur gerendert, welche mit Color(0,0,0,0) gecleared wurde. Ich hab jetzt aber ein Problem mit dem "Linie ziehen". Wie kann ich das am besten anstellen?
Im Moment sieht der Code so aus:

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
#version 120

uniform vec4 lightColor;
uniform vec2 lightPos;
uniform sampler2D tex;

void main()
{   
    vec2 TexCoord = vec2 (gl_TexCoord[0]);
    vec4 Color = texture2D (tex,TexCoord);
    
    if (Color.a == 0)
    {
        vec2 vector = vec2 (lightPos - TexCoord); 
        vec2 Pos = vec2 (TexCoord);         
        while (Pos != lightPos)
        {   
            Pos += vector; 
            vec4 Color2 = texture2D (tex,Pos); 
            if (Color2.a != 0)
            {
                gl_FragColor = vec4 (0.0,1.0,0.0,1.0); // farbe grün zum test
                return;
            }
       }

    gl_FragColor = lightColor; // wenn nicht im schatten liegt, dann beleuchet
    }
    
    else 
        gl_FragColor = Color; // wenn es ein Objekt ist, farbe so lassen
}



Das ganze funktioniert überhaupt nicht wirklich, teils entstehen grüne artefakte und flimmern. Außerdem ist der Schatten an der völlig falschen stelle und hat auch nicht die richtige Form.
-->> Code ist Bullshit^^

Wie berechne ich richtig, welcher Pixel jetzt im Schatten liegt und welcher nicht? Bin ich auf dem richtigen Weg oder ist das alles unnötig? Wenn ja, wie macht man dann 2D Schatten?

Bin über jede Antwort dankbar =)

lg chaia

Beiträge: 721

Wohnort: /dev/null

Beruf: Software-Entwickler/Nerd

  • Private Nachricht senden

2

16.04.2011, 21:00

Es ist eigentlich ein ziemlich einfacher Prozess. Guckst du hier:
http://www.catalinzima.com/samples/12-mo…mic-2d-shadows/

3

17.04.2011, 20:03

Danke für den Link, aber leider kann ich mit der Seite nicht viel anfangen, denn:
- der GameDev Artikel auf welchem die verlinkte Seite aufbaut ist nicht mehr verfügbar
- mit dem herunterladbaren Projekt kann ich auch nicht sooo viel anfangen, da es in C# geschrieben ist und XNA verwendet

Ich verwende allerdings C++ mit der sfml.
Auf der selben Seite hab ich dann noch das gefunden, allerdings blicke ich bei 2., wo die LightRays parallel gemacht werden nicht so ganz durch.
Ich habe dann noch weiter gegoogelt und diese Seite gefunden. Dort haben sie es ähnlich gemacht wie ich es versuchte (mit einer Linie zum Licht). Leider verstehe ich gerade den wichtigen Teil nicht ganz^^

Was passiert hier, bzw. was wäre lerp in GLSL?

HLSL-Quelltext

1
2
3
4
5
6
7
8
 for(float p = 0;p < 1;p+=.01f)
        {
            if(tex2D(mapSampler,float2(lerp(lightPos,texCoord,1 / (p+1)))).a != 0)
            {
                Shadow = true; 
                break;
            }
        }


lg chaia

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

4

17.04.2011, 20:36

Wenn du mit der SFML arbeitest, dann schau dir mal das hier an:
http://www.sfml-dev.org/wiki/fr/sources/lightmanager

Der Text ist zwar französisch, aber der Code ist egtl. recht verständlich und es dürfte deutlich werden, wie sie es lösen.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

17.04.2011, 20:45

CSingleton ftw, hehe.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

6

17.04.2011, 22:02

Okay gut, dann werd ich das noch bisschen umschreiben und u.a. das in diesem fall extrem unnötige singleton wegmachen^^
Das einzige Manko ist, dass das ganze nur mit Linien/Rechtecken/Dreiecken funktioniert. Mit beliebigen Shapes wäre das wohl ein bisschen zu komplex.

lg chaia

Werbeanzeige