OpenGL und GLSL-Attribute Probleme
-
Hallo Leute!
Ich habe folgendes Problem. In einem Float-Array habe ich die einzelnen Komponenten von Vektoren gespeichert(*V). Zum Beispiel : Ich habe 3 Vektoren 4 Float, also ist mein Array 4*3 groß. Im konkreten Fall sind
V[0]=X Komponenete
V[1]=Y Komponenete
V[2]=Z Komponenete
V[3]=W Komponenete -- für den ersten Vektor z.B. Normale für Punkt 1
.
.Ich wollte diese Normalenvektoren für meinen GLSL-Shader nutzbar machen.
Im Vertex-Shader steht:
attribute vec4 ambient_occlusion; varying float ambient_occlusion_term; void main(void) { gl_Position = ftransform(); ambient_occlusion_term = ambient_occlusion.w; }
Im Hauptprogramm habe ich folgendes definiert!
GLfloat *v; Es wurde ein XML-File genutzt, um das Array zu füllen! glBindAttribLocation(ShaderProgramHandle,2,"ambient_occlusion"); shaderEr=glGetAttribLocation(ShaderProgramHandle,"ambient_occlusion"); glVertexAttrib4fv(shaderEr,v); glVertexAttribPointer(2,4,GL_FLOAT,GL_FALSE,0,0); glEnableVertexAttribArray(2);
Die Visualisierung des Shaders ist aber nicht das, was ich erwartet habe. Das Objekt ist normal eingefärbt. Es sind genug Faces vorhanden. Das XML-File ist auch OK. Er müsste einzelne Faces dunkler darstellen. Ich vermute mal das irgendwas mit dem Index nicht stimmt. Ich benutze für die Vertexpositionen einen Vertex-Buffer.
glGenBuffers(1, &m_VertexVBO); glBindBuffer(GL_ARRAY_BUFFER, m_VertexVBO); glBufferData(GL_ARRAY_BUFFER, sizeof(Lib3dsVector) * 3 * m_TotalFaces, vertices, GL_STATIC_DRAW);
Grüße
-
es stimmt was mit dem index nicht? sieht das mesh also kaputt aus?
-
Hallo!
Nein, die Form des Objekts ist ok! Es ist eine Kugel. aber es kann ja sein, dass er falsche Werte bekommt z.B. für die erste Normale!
Ist denn der Shader Code richtig definiert? Es wird eine leuchtende Kugel dargestellt!
Grüße
-
Also ich seh keinen Grund, wieso es da irgendwas dunkler darstellen sollte. Du gibst den Ambient Occlusion Term aus dem Shader aus, aber tust dann nichts damit!? Oder wie sieht der Fragment Shader dazu aus?
-
Also, in dem Array stecken die Koordinaten des neuen Normalenvektors. Die W-Komponene multipliziere ich im Fragment-Shader mit dem Farbvektor. Der W-Wert ist zwischen 0 (dunkel) und 1 (keine Verdeckung) ?
Muss ich denn die Normalen Vektoren im Vertex-Shader noch zuweisen? Ich dachte das ich das schon getan habe!
Mit diesem Befehl!glBindAttribLocation(ShaderProgramHandle,2,"ambient_occlusion");
Oder?
-
wo ist da etwas mit normale im vertex program?
-
Kann mir echt Keiner helfen?
Also ganz einfach!Meine XML-Datei sieht für eine Ebene mit 4 Punkten so aus:
<v idx="0" occ="1.000000" bnx="0.073804" bny="0.996900" bnz="-0.027256" /> <v idx="1" occ="1.000000" bnx="0.073804" bny="0.996900" bnz="-0.027256" /> <v idx="2" occ="1.000000" bnx="0.073804" bny="0.996900" bnz="-0.027256" />
also 3 Normalenvektoren mit einen zusätzlichen Faktor
Diese Werte lade ich in einem Array ein!
GLfloat *v = new GLfloat[numberofVertices*4]; v[0]=bnx v[1]=bny v[2]=bnz v[3]=occ
Das funktioniert auch! Habe die Werte ausgeben lassen.
Hier ist der Code, der das alles mit dem Shader binden sollteshaderEr=glGetAttribLocation(ShaderProgramHandle,"ambient_occlusion"); ////////glEnableClientState(GL_VERTEX_ARRAY); glVertexAttrib4fv(shaderEr,v); glVertexAttribPointer(shaderEr,4,GL_FLOAT,0,16,0); glEnableVertexAttribArray(shaderEr);
Hier ist der einfache Vetex-Schader-Code
attribute vec4 ambient_occlusion; varying float ambient_occlusion_term; void main(void) { gl_Position = ftransform(); ambient_occlusion_term = ambient_occlusion.w; }
Hier der Fragment-Shader-Code
varying float ambient_occlusion_term; void main (void) { vec4 vAmbient = vec4(0.9, 0.9, 0.9, 1.0); vAmbient.rgb *= ambient_occlusion_term; gl_FragColor = vAmbient; }
Nach den Parametern aus dem XML-File müssten alle Dreiecke weiß visualisiert werden. Aber leider ist ein Dreieck schwarz dargestellt.
Was mache ich hier falsch!
Kann mir Jemand einen Tipp geben?