0

我对 OpenGL 比较陌生,希望让它在可可框架中绘制。我在开发者页面上使用了苹果的示例代码,效果很好。但是,现在我希望能够从顶点结构中进行绘制,以便掌握这个概念。当我为我的 OpenGLView 使用以下代码时,我只得到一个黑色窗口(而不是一个花哨的彩色三角形......)。

#import "MyOpenGLView.h" 
#include <OpenGL/gl.h>
#include <GLUT/GLUT.h>

@implementation MyOpenGLView

    typedef struct _vertexStruct{
        GLfloat position[2];
        GLubyte color[4];
    } vertexStruct;

- (void)drawRect:(NSRect) bounds
{
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);
    drawAnObject();
    glFlush();
}

static void drawAnObject()
{
    const vertexStruct vertices[] = {
        {{0.0f, 1.0f},{1.0, 0.0,0.0,1.0}},
        {{1.0f, -1.0f},{0.0, 1.0,0.0,1.0}},
        {{-1.0f , -1.0f},{0.0, 0.0,1.0,1.0}}
    };

    const GLshort indices[] = {0,1,2};
    glVertexPointer(2, sizeof(vertexStruct),0,&vertices[0].position);
    glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(vertexStruct), &vertices[0].color);
    glDrawElements(GL_TRIANGLES, sizeof(indices)/sizeof(GLshort), GL_SHORT, indices);
}

@end

我在这里想念什么?

4

2 回答 2

1

OS X 10.9 说它正在运行 OpenGL 4.1

好吧,这就是你的问题。

虽然我不明白为什么您没有收到“访问冲突”错误,因为您应该在 OpenGL 中使用已弃用的函数。

以下函数是您正在使用的 OpenGL 3.1 版中已弃用的一些函数。

  • glEnableClientState()
  • glVertexPointer()
  • glColorPointer()

所有gl*Pointer()函数都被弃用的原因是因为它们是固定函数管道的一部分。现在一切都是基于着色器的,现在您假设将VAOVBO(和 IBO)一起使用。

与 VAO 一起使用的功能是。

创造

  • glEnableVertexAttribArray()
  • glVertexAttribPointer()

渲染

  • glBindVertexArray()
  • glDrawArrays()
  • glDrawElements()

是的,glDrawArrays()并且glDrawElements()仍在使用,当您需要为 VAO 创建和绑定 VBO 时,您仍然可以像以前一样执行此操作。

于 2013-11-04T08:23:47.997 回答
0
glVertexPointer(2, sizeof(vertexStruct),0,&vertices[0].position);

应该

glVertexPointer(2, GL_FLOAT,sizeof(vertexStruct),0);

这指定要读取 2 个浮点数,以 12 字节的块为单位,从 0 开始(块中的前 2 个浮点数)

于 2013-11-04T08:19:45.697 回答