Hi,
ich hab da ein kleines Problemchen, an dems grade happert. Ich rendere eine SkyBox mit einer CubeMap. Davor drehe ich die Texturen entsprechend einer Dauerrotation, danach zurück und um 180° (was seltsamerweise nur mit glRotatef(Pi, 0, 1, 0); funktioniert, obwohl alle anderen (Textur-)Rotationen in Grad erfolgen; was aber nichts mit dem Problem zu tun hat) verdreht, damit es auf dem nun gerenderten kleinen Cube vor mir gespiegelt aussieht. Nun will ich da noch einen Shader drauflegen. Allerdings lasse ich derzeit OpenGL mittels glTexGen bzw. über die glBitmap.pas die Texturkoordinaten berechnen. Nun sind diese anscheinend nicht in glSlang verfügbar, da der Cube typisch texturkoordinatenlos-einfarbig blieb. Das brachte mich dann auf diesen Thread, wo es zwar nicht um CubeMaps geht, was aber auch nicht mein Problem löst.
Zusammengefasst:
- Mit Angaben von 2-dimensionalen Texturkoordinaten erhalte ich ein seltsam verzerrtes Bild mit Strahlen, zwar nicht vom Vertex- sondern vom Bildschirm-Mittelpunkt ausgehend, die texturähnliche Farben haben. Siehe auch Bild imAnhang.
- Mit Angaben von 3-dimensionalen Texturkoordinaten erhalte ich zwar eine Textur, aber nur eine statische Fassung.
- Mit der ObjectPlane- oder EyePlane-Lösung aus dem oben genannten Thread
Code: vec4 ecPosition = gl_ModelViewMatrix * gl_Vertex; gl_TexCoord[0].s = dot( ecPosition, gl_ObjectPlaneS[0] ); gl_TexCoord[0].t = dot( ecPosition, gl_ObjectPlaneT[0] ); gl_TexCoord[0].p = dot( ecPosition, gl_ObjectPlaneR[0] ); gl_TexCoord[0].q = dot( ecPosition, gl_ObjectPlaneQ[0] );
das gleiche Ergebnis wie mit 2-dimensionalen Texturkoordinaten - Mit deaktiviertem Shader funktioniert alles wunderbar, der Shader wird auch ohne Meldung kompiliert.
=> Wie kann ich also nun meine CubeMap mit glTexGen wie in glBitmap.pas mit einem Shader benutzen?
Hier nochmal mein derzeitiger kompletter Shadercode, falls doch irgendwo Fehler sein sollten: Vertex:
Code: void main(void) { vec4 ecPosition = gl_ModelViewMatrix * gl_Vertex; gl_TexCoord[0].s = dot( ecPosition, gl_ObjectPlaneS[0] ); gl_TexCoord[0].t = dot( ecPosition, gl_ObjectPlaneT[0] ); gl_TexCoord[0].p = dot( ecPosition, gl_ObjectPlaneR[0] ); gl_TexCoord[0].q = dot( ecPosition, gl_ObjectPlaneQ[0] ); gl_Position = ftransform(); }
Fragment:
Code: uniform samplerCube texUnit1; void main(void) { gl_FragColor = textureCube(texUnit1, vec3(gl_TexCoord[0])); }
"Intern":
Code: tCubeMap := TGLBitmapCubeMap.Create; for i := 0 to 5 do begin tCubeMap.LoadFromFile(ExtractFilePath(Application.ExeName)+'tex\cubemap'+tex[i]+'.bmp'); tCubeMap.GenerateCubeMap(GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB+i); end; tCubeMap.Bind; .... glUniform1i(glGetUniformLocationARB(SP.GetObject, PGLCharARB('texUnit1')), 0);
(glBitmap.pas Version 1.8.9 und dglOpenGL-Header Version 2.0)
Falls es eine Rolle spielen sollte, Treiber ist 91.31 ForceWare auf einem NV 7900GT-Chip und wie gesagt, ansonsten funktioniert alles prächtig.
Schonmal Danke im Voraus und fürs Durchlesen, ist etwas lang geworden.
MfG
Dateianhänge: |
Dateikommentar: beschriebenes Renderverhalten, siehe Posting
screen_error1.jpg [177.1 KiB]
72-mal heruntergeladen
|
|