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);
}
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.