GLSL und Framebuffer

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
kristof
Beiträge: 92
Registriert: 19.01.2009, 13:05

GLSL und Framebuffer

Beitrag von kristof »

Hallo ihr ZFX´ler,

Ich bin gerade auf ein kleines Problem bezüglich OpenGL gestossen was ich mir nicht wirklich erklären kann. Vielleicht kann mir ja hier einer helfen.

Zum lernen von GLSL und um OpenGL etwas näher kennen zu lernen schreibe ich gerade an einem kleinen 2D Defered Beleuchtungssystem. Erstmal funktioniert das auch ganz gut.
In der ersten Variante habe ich zwei Framebuffer erzeugt. einen für die Farbwerte und einen für die Lichter. Jeweils mit einer Textur zum rendern. Ich rendere also erst die Geometrie (Hier erstmal nur ein weisses, Bildschirm füllendes Rechteck) und dann rendere ich die Lichter. Im letzten Schritt rendere ich dann ein Bildschirmfüllendes Rechteck, bei dem einfach die Farbwerte mit dem Licht multipliziert werden. Das wird dann angezeigt und sieht auch so aus wie ich mir das vorgestellt habe.

Jetzt dachte ich mir, dass es vielleicht sinnvoller wäre nur einen Framebuffer zu verwenden und zwei Texturen damit zu verbinden. Also wieder eine für die Farbwerte und eine für die Lichter. Im Fragment Shader beschreibe ich die Texturen jetzt mit gl_FragData[n] anstatt mit gl_FragColor.

Hier mal der noch relativ primitive Shader für die Lichter:

Code: Alles auswählen

uniform vec4 lightColor;
uniform vec2 lightPos;

varying vec2 position;

void main()
{
    float dist = length(position);
    
    float c = 1.0;

    gl_FragData[1] = lightColor * c / (1.0 + 0.0 * dist + 0.004 * dist * dist);
	
}
Was mich jetzt wundert ist, dass wenn c = 1.0 ist, wie hier, dann bekomme ich nur gelbe Kreise. Es wird also jeder Pixel mit der gleichen Farbe gefüllt.
So sieht es aus, wenn c = 1.0
So sieht es aus, wenn c = 1.0
Ändere ich c minimal nach oben oder unten, so werden die lichter wieder angezeigt. Allerdings egal wie gross ich c wähle, die Lichtintensität ändert sich nicht. Das hat sie in der alten Implementierung aber noch gemacht.
So soll es aussehen
So soll es aussehen
Vielleicht hat ja einer von euch eine Idee woran das liegen könnte. Vielleicht war das auch überhaupt keine gute Idee nur einen Framebuffer zu verwenden?

Viele Grüsse,
Kristof

Edit: Ok, wie das immer so ist. War ein ganz dummer Fehler. Ich muss natürlich in gl_FragData[0] schreiben wenn ich nur eine Textur aktiviere. Komisch nur, dass dann überhaupt etwas zu sehen war. Naja, das Problem ist gelöst.
Antworten