当在GLKViewController之外使用时,gldrawelements在xcode中访问不良



我对OpenGL ES很陌生,但我所要做的就是在Character类中使用glDrawElements绘制索引顶点。我已经得到了这个工作之前在我的GLKViewController类,但是当我尝试创建一个Character类,将执行自己的渲染,我只有BAD_ACCESS。这是我的Character类:

#import "Character.h"
@interface Character()
{
    GLuint _vertexBuffer;
    GLuint _indexBuffer;
    GLuint _vertexArray;
}
@property(nonatomic, weak) GLKBaseEffect *effect;
@end
typedef struct {
    float Position[3];
    float Color[4];
} Vertex;
const Vertex Vertices[] = {
    {{1, -1, 0}, {1, 0, 0, 1}},
    {{1, 1, 0}, {0, 1, 0, 1}},
    {{-1, 1, 0}, {0, 0, 1, 1}},
    {{-1, -1, 0}, {0, 0, 0, 1}}
};
const GLushort Indices[] = {
    0, 1, 2,
    2, 3, 0
};
@implementation Character
- (id)initWithEffect:(GLKBaseEffect *)effect
{
    if (self = [super init])
    {
        self.effect = effect;
        [self setupGL];
    }
    return self;
}
- (void)setupGL
{
    glGenVertexArraysOES(1, &_vertexArray);
    glBindVertexArrayOES(_vertexArray);
    glGenBuffers(1, &_vertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
    glGenBuffers(1, &_indexBuffer);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices), Indices, GL_STATIC_DRAW);

    glEnableVertexAttribArray(GLKVertexAttribPosition);
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, Position));
    glEnableVertexAttribArray(GLKVertexAttribColor);
    glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, Color));

    glBindVertexArrayOES(0);
}
- (void)teardownGL
{
    glDeleteBuffers(1, &_vertexBuffer);
    glDeleteBuffers(1, &_indexBuffer);
}
- (void)render
{
    self.effect.transform.modelviewMatrix = GLKMatrix4Translate(GLKMatrix4Identity, self.position.x, self.position.y, self.position.z);
    self.effect.transform.modelviewMatrix = GLKMatrix4Rotate(self.effect.transform.modelviewMatrix, self.rotation, 0.0f, 0.0f, 1.0f);
    [self.effect prepareToDraw];
    glBindVertexArrayOES(_vertexArray);
    glDrawElements(GL_TRIANGLES, sizeof(Indices) / sizeof(Indices[0]), GL_UNSIGNED_SHORT, 0);
}
@end

然后在ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
    GLKView *view = (GLKView *)self.view;
    view.context = self.context;
    character = [[Character alloc] initWithEffect:self.effect];
    character.position = GLKVector3Make(self.view.bounds.size.width / 2, self.view.bounds.size.height / 2, 0.0f);
    [self setupGL];
}
使用:呈现

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
    glClearColor(0.65f, 0.65f, 0.65f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    [character render];
}

我知道这不是像字节大小计算错误那样简单的事情,因为我已经在这个问题上呆了几天了。

很难在快速阅读中确定,但看起来问题是,当您在-[Character setupGL]中设置VAO时,您没有当前的GL上下文。

创建EAGLContext对象不会使其成为当前上下文。如果你的视图控制器中的其余代码看起来像Xcode"OpenGL Game"模板,ViewController不会设置当前上下文,直到它自己的setupGL方法,你只有在调用你的Character类并尝试设置OpenGL ES资源后才调用它。

相关内容

  • 没有找到相关文章

最新更新