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

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

1

28.02.2012, 10:11

Frage zu "texture2D", "shadow2D", "texture2DProj" (GLSL) und allg. Shadow-Mapping

Hi, wie ihr sicherlich schon bemerkt habt, arbeite ich mal wieder an Shadern (GLSL) die genau das machen (sollen), wozu sie ursprünglich gedacht waren: zum Schattieren :D
Jetzt habe ich bislang nur mit Point-Light-Shadow-Mapping durch Cube-Maps gearbeitet. Folglich habe ich für die ShadowMap-Samples auch nur textureCube im Shader Code verwendet.
Jetzt will ich aber auch mal mit Spot-Lights arbeiten. Die sehen auch top aus und haben deutlich weniger over-head.

Für die bisherigen Shadow Maps habe ich immer folgendes Texture Format verwendet: GL_LUMINANCE16 (also nur eine Farbkomponente mit 16 bit floats)
Warum ich nicht Depth-Component nehme? Ich render nicht die Tiefe in die Texture sondern speicher als Farbwert die Distanz (per distance(a, b)) zwischen Pixel und Lightquelle.

Hier sind jetzt meine Fragen:
- Wann genau brauche ich "shadow2D", "texture2D" und "texture2DProj"? Also shadow2D würde ich mal raten ist für "Depth-Component" Texture Formate.
Und "texture2DProj" verstehe ich nicht wie genau der aus der 3D Koordinate eine Texture Koordinate errechnet?!

- Und ist es sinnvoll LUMINANCE zu verwenden für shadow-mapping (ich glaube bei Depth-Component wird der Wert autom. zwischen 0.0 und 1.0 geclampt, daher denke ich passt LUMINANCE für meine Zwecke schon)

- Und ist es deutlich performanter nur den Z-Wert zu speichern und nicht distance für jeden Fragment aufzurufen oder nicht?
afaik ist die Technik mit der Distanz seit "FarCry" recht beliebt.

Danke schon mal für eure Antworten :)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

28.02.2012, 10:38

Und "texture2DProj" verstehe ich nicht wie genau der aus der 3D Koordinate eine Texture Koordinate errechnet?!


Die Funktion führt noch eine perspektivische Division der Koordinaten durch, also eine Konvertierung von der homogenen- in die kartesische Form. Ansonsten entspricht das Verhalten dem von texture2D:

C-/C++-Quelltext

1
2
3
vec3 coords = ...
coords.xy /= coords.w;
color = texture2D(sampler, coords);
@D13_Dreinig

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

3

28.02.2012, 10:42

Dann müsste es aber doch eine "vec4" sein. "vec3" hat doch keine "W" Komponente, oder?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

28.02.2012, 10:57

Es wird einfach immer durch die letzte Komponente geteilt.

Mit einem sampler2DShadow, kannst du die depth-comparison von der Hardware erledigen lassen und bekommst schon ein gefiltertes Resultat der 2x2 Texel um die Texcoords herum zurück.

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

5

28.02.2012, 11:16

Kann ich "sampler2DShadow" auch für LUMINANCE Texture Formate verwenden? Und wann genau wird da die Comparision durchgeführt, also welche Funktion braucht man dafür?

Werbeanzeige