【发布时间】:2012-10-29 01:32:11
【问题描述】:
我有一个目前非常简单的 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();
如果我注释掉NSOpenGLPixelFormatAttribute 数组中的NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core,,这段代码可以很好地绘制三角形,但是一旦我启用了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(),然后它返回GL_INVALID_OPERATION。我试图弄清楚为什么会发生这种情况,但仍然没有运气。
【问题讨论】:
-
尝试在 Z 轴上的
-1处制作三角形。这可能是问题所在。还介意您是否发布了您的着色器以及您的 MVP 矩阵? -
无论我是否使用我的顶点/片段着色器实际上并没有什么不同,但我会在一秒钟内把它们放好。而且我认为我没有 MVP 矩阵。
-
哦,我刚刚尝试将 z 轴上的顶点设置为 -1,但它仍在发生。
-
哇,我被难住了。从我看到你的代码看起来不错。尝试改用
#import <OpenGL/gl3.h>看看是否是问题所在。如果没有,请尝试使用 this 检查 OpenGL 是否报告任何错误。 -
您也可以使用 OpenGL Profiler 运行它,看看它是否会产生任何错误。我发现
glGetError()没有报告一些 VAR 错误。