gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:20:23 26 4
gpt4 key购买 nike

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

我有一个用于在 Nib 中实例化的 View 的 Controller 类。在 -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);
}

就在链接程序之前,我进行此调用来绑定(bind)属性位置:

glBindAttribLocation(programID, 0, "position");

编辑2:

我不知道这是否有帮助,但我只是单步执行我的程序,运行 glGetError() ,看起来一切都很好,直到我真正调用 glDrawArrays() ,然后返回GL_INVALID_OPERATION。我试图找出为什么会发生这种情况,但仍然没有运气。

最佳答案

我明白了这一点,可悲的是,这对我来说是一个非常愚蠢的错误。

我认为问题是,在使用 3.2 核心配置文件时,您需要一个顶点着色器和一个片段着色器,没有它们就无法渲染。它不能与我的着色器一起使用的原因是...等待它...链接我的着色器程序后,我忘记将程序ID存储在我的类中的ivar中,所以稍后当我调用 glUseProgram() 时,我只需使用零参数调用它即可。

我猜造成困惑的主要来源之一是我希望 3.2 核心配置文件无需任何顶点或片段着色器即可工作。

关于cocoa - 当我使用 OpenGL Core Profile 3.2 时,我的三角形不渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13107393/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com