Hallo erstmal,
ich hab mich in den letzten wochen mal etwas intensiver mit Shadern auseinander gesetzt und bin jetzt promt ein Problem gestoßen:
Erstmal mein Ziel: ich habe eine Szene, dich ich zuerst spiegele und dann in eine Textur render. (Also eine Textur als Spiegel...). Soweit ist die Welt ja noch in Ordnung, meine Szene wird korrekt gerendert und ausgegeben. Nun will ich die Spiegelfläche mit einem Shader modifizieren (erstmal ein einfacher Texturewrapper, der eine spiegelnde Wasseroberfläche erstellen soll). Und jetzt beginnt mein Problem:
Da ich für die korrekte Darstellung der Reflektionstextur die Texturmatrix ändere, funktioniert mein Shader nicht mehr so ganz. Ich habe bereits viel im Shader ausprobiert (gl_TexCoord mit der TexturMatrix mulitpliziert usw.) aber nichts hat wirklich funkioniert.
Ich poste mal die wichtigsten Teile meines Quelltextes, um die Sache etwas verständlicher zu machen:
Die gespiegelte Szene wird hier in die Textur kopiert:
Code: glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, ForItem.ReflectionTexWidth, ForItem.ReflectionTexHeight);
Bevor ich die Textur rendere, verändere ich noch die Texturmatrix. Sonst wird die Textur nicht korrekt auf das Quad gezeichnet:
Code: glMatrixMode(GL_TEXTURE); glLoadIdentity; glTranslatef(0.5, 0.5, 0); glScalef(0.5, 0.5, 0); gluPerspective(45, Engine_RenderOptions.iViewPortWidth/Engine_RenderOptions.iViewPortHeight, 0.001, 128); glMultMatrixf(@Engine_RenderOptions.mCameraMatrix); glMatrixMode(GL_MODELVIEW); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
Jetzt das Rendern des Quads (GL_TEXTURE0_ARB ist die "Normal-Textur", die die Wasseroberfläche simuliert, GL_TEXTURE1_ARB ist die Reflektionstextur) (Nicht wundern, dass die Texturkoordinaten gleich mit den Vertex-Koordinaten sind. Ich hab mir den Quelltext von einer Demo von Delphi3d.net abgekupfert - meine selbstgeschriebene Reflektionsfunktion usw. hat hinten und vorne nicht funkioniert)
Code: glBegin(GL_QUADS); glMultiTexCoord2fvARB(GL_TEXTURE0_ARB, TexturePos1); glMultiTexCoord3fvARB(GL_TEXTURE1_ARB, VertexPos1); glVertex3f(VertexPos1); glMultiTexCoord2fvARB(GL_TEXTURE0_ARB, TexturePos2); glMultiTexCoord3fvARB(GL_TEXTURE1_ARB, VertexPos2); glVertex3f(VertexPos2); glMultiTexCoord2fvARB(GL_TEXTURE0_ARB, TexturePos3); glMultiTexCoord3fvARB(GL_TEXTURE1_ARB, VertexPos3); glVertex3f(VertexPos3); glMultiTexCoord2fvARB(GL_TEXTURE0_ARB, TexturePos4); glMultiTexCoord3fvARB(GL_TEXTURE1_ARB, VertexPos4); glVertex3f(VertexPos4); glEnd();
So, das waren die Render-Sachen in Delphi - jetzt zu meinem Shader:
Code: // Vertex Shader void main(void) { gl_TexCoord[0] = gl_MultiTexCoord0 ; gl_TexCoord[1] = gl_MultiTexCoord1 ; gl_Position = ftransform(); gl_FrontColor = gl_Color; } // Fragment Shader uniform float syg_Render_Time_TotalTime; // die aktuelle Zeit in Sekunden uniform sampler2D syg_Object_Texture_1; // das ist die Normal-Textur uniform sampler2D syg_Object_Texture_1_Reflect; // und das die Reflektionstextur void main(void) { vec3 noiseVec; vec2 displacement; float scaledTimer; displacement = gl_TexCoord[0].st; scaledTimer = syg_Render_Time_TotalTime*0.1; displacement.x += scaledTimer; displacement.y -= scaledTimer; noiseVec = normalize(texture2D(syg_Object_Texture_1, displacement.xy).xyz); noiseVec = (noiseVec * 2.0 - 1.0) * 0.035; vec4 FragColorA; float Alpha; Alpha = gl_Color.a; FragColorA = texture2D(syg_Object_Texture_1_Reflect, gl_TexCoord[0].st + noiseVec.xy); FragColorA.w = Alpha; gl_FragColor = FragColorA; }
ich habe mal 3 screenshots gemacht, um das Problem nochmals zu verdeutlichen:
In Bild 1 sieht man ganz deutlich (oder auch nicht so deutlich ... aber bei genauem hinsehen ... in Realtime funkionierts - das könnt ihr mir glauben ), dass der shader schon mal seine dienste ausführt
In Bild 2 sieht man, dass die Reflektionstextur OHNE shader korrekt plaziert wird
In Bild 3 sieht man das eigentliche Problem: die Texturmatrix wird vom Shader nicht übernommen (aber auch hier ist eine leichte Refraction bemerkbar )
Ich danke schon mal für die Hilfe
Dateianhänge: |
Dateikommentar: Bild 3

Shader-Geht schief.jpg [ 182.49 KiB | 5654-mal betrachtet ]
|
Dateikommentar: Bild 2

Reflektionstest.jpg [ 218.25 KiB | 5654-mal betrachtet ]
|
Dateikommentar: Bild 1

Shader-ShaderTest.jpg [ 196.2 KiB | 5654-mal betrachtet ]
|
|