DGL
https://delphigl.com/forum/

glTexGen in Shader nachbauen ?
https://delphigl.com/forum/viewtopic.php?f=20&t=4189
Seite 1 von 1

Autor:  Blechwolf [ So Mai 22, 2005 15:54 ]
Betreff des Beitrags:  glTexGen in Shader nachbauen ?

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:
  1.  
  2. varying vec3 myTexCoord;
  3.  
  4. uniform vec4 XPlane;
  5. uniform vec4 YPlane;
  6. uniform vec4 ZPlane;
  7.  
  8. mat3 Transpose(mat3 m)
  9. {
  10.   mat3 tmp;
  11.   tmp[0][0] = m[0][0];
  12.   tmp[0][1] = m[1][0];
  13.   tmp[0][2] = m[2][0];
  14.  
  15.   tmp[1][0] = m[0][1];
  16.   tmp[1][1] = m[1][1];
  17.   tmp[1][2] = m[2][1];
  18.  
  19.   tmp[2][0] = m[0][2];
  20.   tmp[2][1] = m[1][2];
  21.   tmp[2][2] = m[2][2];
  22.  
  23.   return tmp;
  24. }
  25.  
  26. void main(void) {
  27.   vec4 EyeVertex = gl_ModelViewMatrix*gl_Vertex;
  28.   mat3 InverseModelView = Transpose(gl_NormalMatrix);
  29.   vec4 XEyePlane = vec4(vec3(XPlane)*InverseModelView,0.0);
  30.   vec4 YEyePlane = vec4(vec3(YPlane)*InverseModelView,0.0);
  31.   vec4 ZEyePlane = vec4(vec3(ZPlane)*InverseModelView,0.0);
  32.  
  33.   myTexCoord.s = dot(EyeVertex,XEyePlane);
  34.   myTexCoord.t = dot(EyeVertex,YEyePlane);
  35.   myTexCoord.p = dot(EyeVertex,ZEyePlane);
  36.   gl_Position = ftransform();
  37. }
  38.  

Autor:  LarsMiddendorf [ So Mai 22, 2005 16:26 ]
Betreff des Beitrags: 

Von 3DLabs gibt es ein Tool, dass GLSL Shader generiert.
http://developer.3dlabs.com/downloads/s ... /index.htm

Da wird das so gemacht:

Code:
  1. vec4 ecPosition = gl_ModelViewMatrix * gl_Vertex;
  2. gl_TexCoord[0].s = dot( ecPosition, gl_ObjectPlaneS[0] );
  3. gl_TexCoord[0].t = dot( ecPosition, gl_ObjectPlaneT[0] );
  4. gl_TexCoord[0].p = dot( ecPosition, gl_ObjectPlaneR[0] );
  5. gl_TexCoord[0].q = dot( ecPosition, gl_ObjectPlaneQ[0] );

Autor:  Blechwolf [ So Mai 22, 2005 16:36 ]
Betreff des Beitrags: 

Werd ich mal testen. Laut Orange Book ('OpenGL Shading Language') gibt es auch entsprechende gl_EyePlaneS[0] Variablen. Allerdings meckert glslValidate bei mir.
Scheinbar sollte ich es mir doch mal angucken...

Autor:  Blechwolf [ Mo Mai 23, 2005 09:48 ]
Betreff des Beitrags: 

Schlimm wie einem ein Simpler Rechtschreibfehler den Tag versauen kann...

Dumm wenn man statt gl_EyePlaneS gl_EyePlanesS schreibt. Dann kann das nicht funktionieren...

Naja, auf jeden Fall tut es das jetzt und in dem Thread zu Dependent-Textures gibt es jetzt den vollständigen Shader zu bewundern. Wenn auch nur eingeschränkt auf EYE_LINEAR und EYE_PLANE bei glTexGen.

Grüße

Wolf

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/