iOS用の単純なOpenGL ES 2.0アプリケーションを作成しています。私はこれまで、glEnableVertexAttribArrayを2つの属性(位置と色)に対して呼び出すと、glGetAttribLocationが1の位置を返し、0の色が返され、glGetUniformLocationがMVPの0を返すことがわかったマトリックス。 0が有効な値であるかどうか、またはglDrawArraysが呼び出されたときにglEnableVertexAttribArrayがEXC_BAD_ACCESSを引き起こしているように見える理由はわかりません。ここでglGetAttribLocation/glGetUniformLocationは0を返し、glDrawArraysコール(iOS)でEXC_BAD_ACCESSを引き起こします。
は私のコードです:
compileShaders機能:
-(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);
My機能をレンダリング:
-(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];
}
そして、私の頂点シェーダ:
attribute vec4 position;
attribute vec4 color;
uniform mat4 MVP;
varying vec4 v_color;
void main(void) {
gl_Position = MVP * position;
v_color = color;
}
@Matias:実際にはありません。 0は、glCreateProgram()とglCreateShader()の両方に対するエラー戻り値です。 http://www.opengl.org/sdk/docs/man/xhtml/glCreateShader.xmlおよびhttp://www.opengl.org/sdk/docs/man/xhtml/glCreateProgram.xmlを参照してください。今それは私のために固定されている、私はそれぞれのためのゼロ以外のリターンを得る。 –