glGetAttribLocation/glGetUniformLocation gibt 0 zurück, wodurch EXC_BAD_ACCESS auf glDrawArrays anrufen (iOS)
Erstelle ich ein einfaches OpenGL ES 2.0-Anwendung für iOS, und immer wenn ich call glDrawArrays. Ich habe festgestellt, dass dies Auftritt, wenn ich vorher genannt glEnableVertexAttribArray für meine zwei Attribute (Farbe und position), und dann festgestellt, dass glGetAttribLocation wurde wieder 1 für die position und 0 für die Farbe, und dann auch festgestellt, dass glGetUniformLocation wurde wieder 0 für meine MVP-matrix. Ich bin nicht sicher, ob 0 ein Gültiger Wert ist, oder warum glEnableVertexAttribArray zu sein scheint verursacht EXC_BAD_ACCESS, wenn glDrawArrays genannt wird.
Hier ist mein code:
compileShaders Funktion:
-(void)compileShaders {
GLuint vertShader = [self compileShader:@"Shader" ofType:GL_VERTEX_SHADER];
GLuint fragShader = [self compileShader:@"Shader" ofType:GL_FRAGMENT_SHADER];
GLuint program = glCreateProgram();
glAttachShader(program, vertShader);
glAttachShader(program, fragShader);
glLinkProgram(program);
GLint success;
glGetProgramiv(program, GL_LINK_STATUS, &success);
if (success == GL_FALSE) {
GLchar messages[256];
glGetProgramInfoLog(program, sizeof(messages), 0, &messages[0]);
NSLog(@"%@", [NSString stringWithUTF8String:messages]);
exit(1);
}
glUseProgram(program);
_positionSlot = glGetAttribLocation(program, "position");
_colorSlot = glGetAttribLocation(program, "color"); //Returns 0
_mvpSlot = glGetUniformLocation(program, "MVP"); //Returns 0
if (!_positionSlot || !_colorSlot || !_mvpSlot) {
NSLog(@"Failed to retrieve the locations of the shader variables:\n Position:%i\n Color:%i\n MVP:%i", _positionSlot, _colorSlot, _mvpSlot); //Prints out the values of 1, 0, 0
}
glEnableVertexAttribArray(_positionSlot);
glEnableVertexAttribArray(_colorSlot);
Meine render Funktion:
-(void)render:(CADisplayLink *)displayLink {
glClearColor(0.5, 0.5, 0.5, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
GLfloat mvp[16] = {
1.0f, 0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f,
};
glUniformMatrix4fv(_mvpSlot, 1, 0, mvp);
glViewport(0, 0, width, height);
glVertexAttribPointer(_positionSlot, 3, GL_FLOAT, GL_FALSE, 0, vertices);
glVertexAttribPointer(_colorSlot, 4, GL_UNSIGNED_BYTE, GL_FALSE, 0, colors);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
[_context presentRenderbuffer:GL_RENDERBUFFER];
}
Und meine vertex-shader:
attribute vec4 position;
attribute vec4 color;
uniform mat4 MVP;
varying vec4 v_color;
void main(void) {
gl_Position = MVP * position;
v_color = color;
}
InformationsquelleAutor Daniel | 2011-07-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
0 ist ein Gültiger Wert, bei -1 ist der "Fehler" oder "nicht gefunden" - Wert. Der Raum für die einheitliche Standorte und attrib Standorten getrennt ist, so ist es gut beides zu haben, eine Lage 0 uniform und eine Lage 0-Attribut.
Sollten Sie post die vertices und Farben arrays zu überprüfen, ob Sie haben die richtige Größe, dies ist wahrscheinlich zu einem Absturz führen.
InformationsquelleAutor Matias Valdenegro
Ich habe das gleiche Problem und keine Lösung, aber ich habe versucht, ausführlich zu Debuggen, also dachte ich, vielleicht könnte es hilfreich sein, zu teilen.
Ich verfolgte die Frage bis zu
glCreateProgram()
undglCreateShader()
Anrufe. Beide null zurückgeben, die den Fehler zurückgeben. Aber in beiden FällenglGetError()
zurückGL_NO_ERROR
. In der Tat kein Fehler erscheint, den ganzen Weg durch die compile-und link-Kette erstellen-Anrufe.Ich habe das gleiche symptom, das
glGetAttribLocation
und auch die Uniformen immer null zurückgeben (anstatt -1 für Fehler!). Aber ich kann Sie sogar füttern gebrochen shader-Dateien, und Sie führen nicht zu einem compile-Fehler oder keine log-Informationen. Die richtige Zeichenfolge wurde überprüft, um eingespeist werden zu kompilieren.Ich bin völlig verblüfft durch das Verhalten, weil klar
glCreateProgram
Fehler aber nicht ein Fehler. Und es ist mir nicht klar darüber, warum es nicht Fehler. Was ist besonders verwirrend ist, dass eine ganze Kette von GL-Funktion ruft nicht zurück Fehler. Ich bin immer meine erste Fehlermeldung, wenn ich das Programm fordert eine gl-Funktion, die arbeitet auf einer uniform, wieglUniformMatrix4fv()
oderglUniform1i()
. Aber klar, Dinge, die gebrochen sind Weg, bevor Sie dann, weil alle Uniformen zurückgeben als 0, obwohl Sie nicht alle null sein.Edit: fand ich die Lösung in meinem Fall. Opengles1 scheint Recht flexibel bei der Framebuffer eingerichtet sind. Aber ich brauchte, um Kraft framebuffer-setup vor dem Start mit Shader, um loszuwerden, das Problem. z.B. wenn man folgt der alten eaglview Vorlage, Framebuffer erstellt, in
layoutSubviews
, aber das ist zu spät für eine typische Initialisierung der Shader sageninitwithcoder
. Die Symptome sind die oben genannten anders.InformationsquelleAutor Georg Essl