Hi, hab eigentlich immer versucht, einen Bogen um Shader zu machen, aber nun will ich sie mir mal doch ansehen... und schon das erste Problem, in einer eigentlich sehr leichten Beispielanwendung:
Zeichnet mir ein Farbiges Rechteck auf den Bildschirm
Wenn ich nun die oberste Zeile reinnehme, bleibt das Bild schwarz. Allerdings kommt auch kein Fehler. Der Inhalt des Shaders wird correct geladen, compiliert und gelinkt. Also nehme ich mal an, der Shader ist falsch. Aber der ist im grunde auch äußerst simpel:
Okay ich hab das gl_FrontColor = gl_Color; in den vertexshader eingebaut Allerdings bekomme ich nun eine GL_INVALID_OPERATION
Das Quad wird zwar gezeichnet, aber das wird ja standardmäßig gezeichnet, ob der Shader nun aktiviert ist oder nicht. Die GL_INVALID_OPERATION tritt bei dem aufruf von glUseProgram auf. laut wiki sorgt GL_INVALID_OPERATION dafür, dass die entsprechende operation ignoriert wird. also ist das ganze im Endeffekt so, als haette ich den Shader gar nicht aktiviert und deswegen wird das quad wohl auch gezeichnet. Woran kann dieses GL_INVALID_OPERATION liegen?
Mh also ne dedizierte Fehlerabfrage beim Compilieren des Shaders hab ich ja im grunde nicht Ich hab nur die OGL Fehlerabfrage
ich habe mal an den vertexshader ne zeichenkette angehängt: x+y beide variablen undefiniert, kein semikolon am ende, sollte hoffentlich knallen Der fehler allerdings bleibt gleich Wenn ich das useProgram aus der renderroutine rausnehme und den shader nur compilieren und linken lasse, kommt gar kein fehler also irgendwas stimmt wohl nicht
Mh also ne dedizierte Fehlerabfrage beim Compilieren des Shaders hab ich ja im grunde nicht Ich hab nur die OGL Fehlerabfrage
Du musst explizit auf Shaderfehler beim compilieren der beiden Shader sowie beim linken testen. Dabei werden keine normalen OpenGL-Fehler ausgelöst! Der (vermutliche) Grund ist das man Shader häufig dynamisch lädt und nicht die ganze Anwendung abstürzen soll nur weil irgendwo ein Shader nicht geht.
_________________ Yeah!
Zuletzt geändert von Coolcat am Di Jul 20, 2010 22:24, insgesamt 2-mal geändert.
Okay sonne kleine Logging Methode wirkt wirklich wunder:
Vertex shader failed to compile with the following errors: ERROR: 0:3: 'gl_FragColor' : undeclared identifier ERROR: 0:3: 'assign' : cannot convert from 'attribute 4-component vector of float' to 'float' ERROR: 2 compilation errors. No code generated.
Und der Grund war, dass ich einfach nicht aufmerksam gelesen hatte. Ich hab im VertexShader fragColor statt frontColor gesetzt... naja nun gehts
eine Variable, die ich Probehalber an den Shader übergeben will:
Code:
gl.glUniform4fv(testShader.getUniformLocation("myColor"), 4, new float[]{0.5f,1f,0.5f,1.0f}, 0);
// erklärung von testShader.getUniformLocation public int getUniformLocation(String identifier) { return gl.glGetUniformLocation(shaderProgram, identifier); }
Resultat: Das Bild bleibt schwarz, OGL meldet eine GL_INVALID_OPERATION, aber der getShaderLogInfo liefert keinen Fehler.
Das Wiki liefert ja nun einige Infos zu invalid_operation: GL_INVALID_OPERATION wird generiert, wenn es kein aktives Programmobjekt gibt. -> ging ja vorher, ich würd sagen, daran liegts nich GL_INVALID_OPERATION wird generiert, wenn die Größe der Uniform-Variable im Shader nicht mit dem entsprechenden Befehl übereinstimmt. -> stimmt meiner Meinung nach GL_INVALID_OPERATION wird generiert, wenn einer der Integer-Verionen dazu verwendet wird, eine Variable vom Typ float, vec2, vec3, vec4 oder eines Arrays dieses Typs zu verändern. Gleiches gilt für das verändern von int-Variablen, die nicht mit Befehlen vom Typ glUniform*f beschrieben werden können. -> versteh ich nicht GL_INVALID_OPERATION wird generiert, wenn location ein ungültiger Ort für das aktuelle Programmobjekt ist und location gleichzeitig -1 ist. -> location liefert den Wert 1. Klingt gültig GL_INVALID_OPERATION wird generiert, wenn count größer als 1 ist und die entsprechende Uniform-Variable kein Array ist. -> zwar größer als eins, aber es geht ja um ein array GL_INVALID_OPERATION wird generiert, wenn ein sampler mit einem anderen Befehl als glUniform1i und glUniform1iv geladen wird. -> kein Sampler, nicht relevant GL_INVALID_OPERATION wird generiert wenn glUniform innerhalb eines glBegin-glEnd Blocks aufgerufen wird. -> auch nicht der Fall
GL_INVALID_OPERATION wird generiert, wenn es kein aktives Programmobjekt gibt.
Hast du vor dem glUniform4fv den glUseProgram aufgerufen? Im Gegensatz zu glGetUniformLocation bekommt glUniform* nämlich nicht das Programm als Parameter übergeben.
So wie mein verständnis ist, brauche ich nicht zwangsläufig ein VBO oder? Ich müsste auch einfach alle Vertices per gl_triangle übergeben können oder? also mit iterierenden x und y koordinaten von 0 bis 64?
Natürlich würde das gehen, die Frage ist was du dann davon hast. Es geht ja darum so wenig Daten wie möglich an die Grafikkarte schicken zu müssen. Wenn du dann doch die Vertexdaten für jeden Terrainblock neu schicken musst kannst du dir den Aufwand auch sparen.
Über eine Displayliste würde es natürlich gehen. So ein VBO und IBO ist aber auch schnell erstellt:
Code:
const int TERRAIN_LEAFSIZE = 64; GLuint m_vboLeaf; GLuint m_iboLeaf;
// create vertex buffer object { glGenBuffers(1, &m_vboLeaf); glBindBuffer(GL_ARRAY_BUFFER, m_vboLeaf); int verts = TERRAIN_LEAFSIZE+1; int data_size = verts*verts*2*sizeof(float); glBufferData(GL_ARRAY_BUFFER, data_size, NULL, GL_STATIC_DRAW); float* data = (float*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); int pos = 0; for (int y=0; y<verts; ++y) { for (int x=0; x<verts; ++x) { data[pos++] = x; data[pos++] = y; } } glUnmapBuffer(GL_ARRAY_BUFFER); }
Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.