当我使用OpenGL Core Profile 3.2时,我的三角形不会渲染

时间:2012-10-28 08:26:11

标签: cocoa opengl

我有一个Cocoa(OSX)项目,目前非常简单,我只是想了解使用OpenGL背后的一般概念。我能够在我的视图中显示一个三角形,但是当我去编写顶点着色器和片段着色器时,我意识到我正在运行传统的OpenGL核心配置文件。因此,在生成上下文之前,我通过在视图的像素格式中设置属性来切换到OpenGL 3.2配置文件,但现在即使没有我的顶点或片段着色器,三角形也不会呈现。

我有一个用于在nib中实例化的视图的控制器类。在-awakeFromNib上设置像素格式和上下文:

NSOpenGLPixelFormatAttribute attr[] =
{
    NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core,
    0
};
NSOpenGLPixelFormat *glPixForm = [[NSOpenGLPixelFormat alloc] initWithAttributes:attr];
[self.mainView setPixelFormat:glPixForm];
self.glContext = [self.mainView openGLContext];

然后我生成VAO:

glGenVertexArrays(1, &vertexArrayID);
glBindVertexArray(vertexArrayID);

然后是VBO:

glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);

g_vertex_buffer_data,该缓冲区的实际数据定义如下:

static const GLfloat g_vertex_buffer_data[] = {
    -1.0f, -1.0f, 0.0f,
    1.0f, -1.0f, 0.0f,
    0.0f, 1.0f, 0.0f,
};

以下是实际绘图的代码:

[_glContext setView:self.mainView];
[_glContext makeCurrentContext];
glViewport(0, 0, [self.mainView frame].size.width, [self.mainView frame].size.height);

glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, self.vertexBuffer);
glVertexAttribPointer(
                      0,
                      3,
                      GL_FLOAT,
                      GL_FALSE,
                      0,
                      (void*)0
                      );
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glDrawArrays(GL_TRIANGLES, 0, 3); // Starting from vertex 0; 3 vertices total -> 1 triangle
glDisableVertexAttribArray(0);
glFlush();

如果我在NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core,数组中注释掉NSOpenGLPixelFormatAttribute,此代码会很好地绘制三角形,但只要我启用OpenGL Core Profile 3.2,它就会显示为黑色。谁能告诉我这里我做错了什么?

编辑:无论我是否打开我的顶点和片段着色器,这个问题仍然存在,但这是我的着色器,以防它有用:

顶点着色器:

#version 150

in vec3 position;

void main() {
    gl_Position.xyz = position;
}

片段着色器:

#version 150

out vec3 color;

void main() {
    color = vec3(1,0,0);
}

在链接程序之前,我调用绑定属性位置:

glBindAttribLocation(programID, 0, "position");

编辑2:

我不知道这是否有帮助,但我刚刚完成了我的程序,运行glGetError()看起来一切正常,直到我实际调用glDrawArrays(),然后它返回{{ 1}}。我试图找出为什么会发生这种情况,但仍然没有运气。

1 个答案:

答案 0 :(得分:2)

我想到了这一点,遗憾的是,我犯了一个非常愚蠢的错误。

我认为问题是在使用3.2核心配置文件时需要顶点着色器和片段着色器,不能只使用它们进行渲染。它不与我的着色器一起工作的原因是......等待它...在链接我的着色器程序之后,我忘了将programID存储在我班级的ivar中,所以后来当我调用glUseProgram()我是只需用零参数调用它。

我想混淆的主要原因之一是我希望3.2核心配置文件在没有任何顶点或片段着色器的情况下工作。