ios - glGetAttribLocation/glGetUniformLocation 返回 0,导致调用 glDrawArrays 时出现 EXC_BAD_ACCESS (iOS)

标签 ios opengl-es exc-bad-access

我正在为 iOS 创建一个简单的 OpenGL ES 2.0 应用程序,每当我调用 glDrawArrays 时。我发现这是在我之前为我的两个属性(位置和颜色)调用 glEnableVertexAttribArray 时发生的,然后发现 glGetAttribLocation 为位置返回 1,为颜色返回 0,然后还发现 glGetUniformLocation 为我的 MVP 返回 0矩阵。我不确定 0 是否是有效值,或者为什么在调用 glDrawArrays 时 glEnableVertexAttribArray 似乎导致 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);

我的渲染函数:

-(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;
}

最佳答案

0 是有效值,-1 是“错误”或“未找到”值。统一位置和属性位置的空间是分开的,因此同时具有位置 0 统一和位置 0 属性是可以的。

您应该发布顶点和颜色数组以检查它们的大小是否正确,这可能会导致崩溃。

关于ios - glGetAttribLocation/glGetUniformLocation 返回 0,导致调用 glDrawArrays 时出现 EXC_BAD_ACCESS (iOS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6792394/

相关文章:

ios - 从 Swift 函数中的异步调用返回数据

ios - 使用 swift NSObjects 和 JSON 的 EXC_BAD_INSTRUCTION

c++ - 有人有在 iOS 下运行的 OpenGL ES 2.0 Qt 5 示例吗?

ios - 修改在 OpenGL ES 2.0 中使用的纹理贴图的一部分

使用 NavigationController 按下按钮时 iOS 应用程序崩溃

ios - topLayoutGuide 在 vi​​ewWillAppear 之后应用

ios - 如何让一个自定义类继承自多个父类(super class)?

ios - 在 IOS 中使用线程时,assimp 无法导入 3d 模型

c++ - 程序崩溃,程序收到信号 EXC_BAD_ACCESS,无法访问内存。原因: KERN_PROTECTION_FAILURE at address: 0x00000000

c++ - 试图读取AIFF文件意外错误与指针位置等有关