Hier mal die zwei Shader sowie ein paar Hinweise zum Aufruf aus dem Programm...
Ich habe eine 3D Textur, deren Textur-Koordinaten automatisch erzeugt werden.
Code: type VV_TVector = array[0..3] of Single; [...] const VV_XVEC : VV_TVector = (1,0,0,0); VV_YVEC : VV_TVector = (0,1,0,0); VV_ZVEC : VV_TVector = (0,0,1,0); [...] TexData : GluInt; TexColorMap : GluInt; [...] // Automatic Texture Coordinate Generation glTexGeni (GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); glTexGeni (GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); glTexGeni (GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); glTexGenfv(GL_S, GL_EYE_PLANE, PGLFloat(@VV_XVEC)); glTexGenfv(GL_T, GL_EYE_PLANE, PGLFloat(@VV_YVEC)); glTexGenfv(GL_R, GL_EYE_PLANE, PGLFloat(@VV_ZVEC)); glEnable (GL_TEXTURE_GEN_S); glEnable (GL_TEXTURE_GEN_T); glEnable (GL_TEXTURE_GEN_R); [...]
Sowie eine 1D Textur [0..1] die Farbwerte enthält. (Eine Colormap quasi, wie sie in Visualisierungs Anwendungen öfter vorkommt)
Binden der beiden Texturen an den Shader:
Code: glUniform1iARB(glGetUniformLocationARB(SlangProg,PGLCharARB('DataTexture')),0); glUniform1iARB(glGetUniformLocationARB(SlangProg,PGLCharARB('ColorMap')),1);
wobei die Texturen vorher mit
Code: glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_3D,TexData) glEnable(GL_TEXTURE_3D)
respektive
Code: glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_1D,TexColorMap); glEnable(GL_TEXTURE_1D);
an die Textur-Einheiten 0 und 1 gebunden wurden.
Hier nun die zwei Shader:
Vertex-Shader: Berechnet die Textur-Koordinaten, da diese bei automatischer Generierung nicht an gl_TexCoord[i] weitergegeben werden.
Code: void main(void) { vec4 EyeVertex = gl_ModelViewMatrix*gl_Vertex; gl_TexCoord[0].s = dot(EyeVertex, gl_EyePlaneS[0]); gl_TexCoord[0].t = dot(EyeVertex, gl_EyePlaneT[0]); gl_TexCoord[0].p = dot(EyeVertex, gl_EyePlaneR[0]); gl_TexCoord[0].q = dot(EyeVertex, gl_EyePlaneQ[0]); gl_Position = ftransform(); }
Fragment-Shader: Holt sich die Werte aus der Daten Textur und nutzt den Alpha-Wert als Index für die Colormap. Der Alpha-Wert bleibt der gleiche wie in der Ausgangstextur, da er für Filter-Zwecke genutzt wird.
Code: uniform sampler3D DataTexture; uniform sampler1D ColorMap; void main(void) { vec4 DepVec; vec4 NewVec; // get Alpha-Value of 3D Texture DepVec.rgba = texture3D(DataTexture,gl_TexCoord[0].stp); NewVec.rgba = texture1D(ColorMap,DepVec.a); gl_FragColor = vec4(NewVec.rgb,DepVec.a); }
|