【问题标题】:gldrawelements bad access in xcode when used outside of GLKViewController在 GLKViewController 之外使用时,xcode 中的 gldrawelements 访问不正确
【发布时间】:2023-04-11 05:32:02
【问题描述】:

我对 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];
}

我知道这不是错误计算字节大小或其他东西那么简单,因为我已经研究了几天了。

【问题讨论】:

    标签: ios opengl-es vertex-buffer vertex-array


    【解决方案1】:

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

    创建EAGLContext 对象不会使其成为当前上下文。如果您的视图控制器中的其余代码看起来像 Xcode“OpenGL 游戏”模板中的代码,ViewController 不会设置当前上下文,直到它自己的 setupGL 方法,您只有在调用您的 @987654326 后调用该方法@class 及其设置 OpenGL ES 资源的尝试。

    【讨论】:

    • 奇怪的是,当我在阅读您的答案后查看此内容时,我已经更改了它,我的代码仍然无法正常工作。 ViewController 和 Character 类的完整代码在这里(ViewController 和 Character 的 Headers 和 implementations):gist.github.com/doctordoder/9480644 这不是很长的阅读,所以我希望你能花时间帮助我并跟进关于你的回答。实际上,我正在请求您的帮助,因为我已经在这方面工作了好几个星期了,而互联网上没有一个单一的答案。
    猜你喜欢
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多