Servus,
ich würde gerne glTexGen (die Funktion zur automatischen Texturgenerierung) in einem Vertex-Programm nachbauen, da glTexGen keine Informationen an glMultiTexCoord liefert und deswegen meine Colormap immer rot (=0) zurückliefert.
Rein theoretisch sollte das eigentlich wie folgt funktionieren:
Ich nehme meinen aktuellen Vertex aus gl_Vertex, multipliziere den mit der ModelViewMatrix um meine Eye-Position zu bekommen.
Je nach Modus (GL_EYE_LINEAR, GL_OBJECT_LINEAR) rechne ich dann noch den Parameter den ich an glTexGen übergeben würde in Eye-Koordinaten um indem ich mit dem Inversen der Modelview Matrix multipliziere.
Abschliessend dann noch ein Dot-Product und fertig bin ich mit meinen Textur-Koordinaten. (Zumindest laut der glTexGen-Spezifikation)
Since so well.
Das Problem ist jetzt das weder Rotationen noch Translationen berücksichtigt werden...
Hat jemand ne Idee ?
Hier mal der Shader so wie er bisher ist:
Code: varying vec3 myTexCoord; uniform vec4 XPlane; uniform vec4 YPlane; uniform vec4 ZPlane; mat3 Transpose(mat3 m) { mat3 tmp; tmp[0][0] = m[0][0]; tmp[0][1] = m[1][0]; tmp[0][2] = m[2][0]; tmp[1][0] = m[0][1]; tmp[1][1] = m[1][1]; tmp[1][2] = m[2][1]; tmp[2][0] = m[0][2]; tmp[2][1] = m[1][2]; tmp[2][2] = m[2][2]; return tmp; } void main(void) { vec4 EyeVertex = gl_ModelViewMatrix*gl_Vertex; mat3 InverseModelView = Transpose(gl_NormalMatrix); vec4 XEyePlane = vec4(vec3(XPlane)*InverseModelView,0.0); vec4 YEyePlane = vec4(vec3(YPlane)*InverseModelView,0.0); vec4 ZEyePlane = vec4(vec3(ZPlane)*InverseModelView,0.0); myTexCoord.s = dot(EyeVertex,XEyePlane); myTexCoord.t = dot(EyeVertex,YEyePlane); myTexCoord.p = dot(EyeVertex,ZEyePlane); gl_Position = ftransform(); }
|