DepthTexture in Shader?
-
Hi
Ich versuche gerade einen Schatten per Shader dar zu stellen, was leider noch Probleme bereitet
Ich zeige dazu erstmal ein paar Zeilen Code:Was bereits erledigt ist:
- Tiefentexture im FBO
- TextureMatrix ausgerechnet (BiasMatrix * LightProjectionMatrix * LightMatrix) - stimmt jedenfalls ^^Die DepthTexture will ich jedenfalls so in den Shader kriegen + TextureMatrix:
glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, shadowdepth); glUniform1i(SDepth1, 1); glUniformMatrix4fv(ShadowTexMat, 16, false, TextureMatrix);
Wobei ich bei der ShaderInitalisierung auch SDepth1 sowie ShadowTexMat wiefolgt anbinde:
SDepth1 = glGetUniformLocation(ShadowShader, "Depth1"); ShadowTexMat = glGetUniformLocation(ShadowShader, "ST1");
Nur ich verstehe echt nicht, wie ich das nun auf meine normale Map übertragen soll.
Ich würde jetzt einfach erstmal im groben so vorgehen:
- glUseProgram(ShadowShader) // Also den Shader starten
- Map Rendern
- glUserProgram(0) // Shader wieder deaktivierenJetzt sollten halt die Teile auf der Map eingefärbt werden, wo die DepthTextureMap ist... nur da gibts leider Probleme
Im VertexShader passiert noch nicht viel:
void main() { gl_FrontColor = gl_Color; gl_TexCoord[0] = gl_MultiTexCoord0; gl_Position = ftransform(); }
Im Vertexshader leider auch nicht viel
:
uniform sampler2DShadow Depth1; uniform mat4 ST1; void main() { vec4 texel = shadow2DProj(Depth1, vec4(ST1)); texel.rgb *= 0.5; //damit es ggf. dunkler wird gl_FragColor = texel * gl_Color; }
Es wäre nett, wenn mir jemand zeigen könnte wie man es richtig macht. Ich habe schon viel damit rumprobiert aber über den Shader will es einfach nie klappen, daher frag ich jetzt mal hier nach.
MfG und einen schönen Abend noch
-
Du moechtest im Vertex-Shader die Vertex-Position mit "ST1" transformieren und den daraus resultierenden Vektor im Pixel-Shader per shadow2DProj auf die 2D-Map projezieren.
-
War das jetzt eine Frage?! Versteh das gerade nicht so genau ^^
-
Nein, eine Aufforderung.
Was genau verstehst Du denn nicht?
-
Irgendwie versteh ich gerade vieles nicht.
Ich habe halt die DepthTexture und die Texture Matrix aber kann mir nicht vorstellen, wie das im Shader überhaupt arbeitet und die Texture rauf kommt.
Außerdem bin ich mir nicht sicher, wo ich den Shader anwenden muss.
Reicht denn einfach das:
- Shader aktivieren
- Szene Rendern
- Shader wieder deaktivieren
?
-
Ich schieb das Thema nochmal nach oben und zeige mein aktuellen Stand nochmal kurz aber deutlich:
Im C++ Code:
- Shader wird aktiviert
- Szene wird gerendert
- Shader deaktiviertDer C++ Code übergibt dem Shader die Tiefentextur sowie die Matrix von der Texture. Diese Matrix setzt sich aus folgenden 3 Dingen zusammen:
BiasMatrix * ProjectionMatrix * LightMatrixBiasMatrix sollte klar sein.
ProjectionMatrix hat den Inhalt von gluPerspective (also Fov, Ration, Near, Far)
LightMatrix enthält die Kameradaten der Lichtquelle (also Ort und Blickrichtung (via gluLookAt).Diese Daten werden jedenfalls an den Shader übergeben.
Im VertexShader wurde mir ja, so wie ich es verstanden habe, dazu geraten:
uniform mat4 SMC1; void main() { gl_FrontColor = gl_Color; gl_TexCoord[0] = gl_MultiTexCoord0; gl_TexCoord[1] = gl_Vertex * SMC1; gl_Position = ftransform(); }
Einen passenden Fragmentshader kann ich nicht wirklich präsentieren, da ich vieles Probiert habe aber nix klappt.
Habe halt lediglich meine uniform sampler2DShadow ShadowMap und eben es mit Shadow2DProj probiert (als Koordinaten gl_TexCoord[1]) genommen - aber es geht halt leider nicht.Anmerkung, vllt. ist es wichtig:
Ohne Shader habe ich die Schatten immer mit diesen beiden Zeilen dargestellt:glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); glTexGenfv(GL_S, GL_EYE_PLANE, Row1);
(war natürlich auch GL_R, GL_Q, GL_T vorhanden).
Könnte mir bitte jemand einen korrekten FragmentShader zeigen, also wo einfach nur der Schatten dargestellt wird? Wäre wirklich nett! Bei Fragen steh ich natürlich zur Verfügung
-
Push
-
Falls es dir noch hilft:
Du brauchst 2 Rendervorgänge.
1 Pass:
Du aktivierst den FBO und speicherst die Tiefe, wobei die Szene aus Sicht der Lichtquelle dargestellt wird.
Hier kannst du auch einen Renderbuffer (also colorattachment) verwenden um dir die ShadowMap (im 2. Pass) ausgeben zu lassen. So siehst du ob diese korrekt gefüllt wird.2 Pass:
Die Szene wird ganz normal dargestellt, jedoch vergleichst du die Tiefenwerte mit den Werten die du im 1.Pass gespeichert hast und kannst dadurch die gewünschten Fragments verdunkeln.D.h. du brauchst jeweils Fragment und Vertex Shader für den 1.Pass und für den 2.Pass.
-
Erstmal danke für die Antwort.
Das erstellen der DepthTexture im FBO klappt ohne Probleme. Nur wie stelle ich im Shader diesen Vergleich an? Da liegt mein Problem.