【发布时间】:2017-07-10 02:52:24
【问题描述】:
我正在使用 OpenGL 3.3 和 EGL 1.4。我用来构建和运行代码 (C) 的笔记本电脑使用英特尔的 HD 3000 集成 GPU 并运行 linux。因此,我使用 Mesa 3D 库。在我的程序中,我在 X11 窗口中创建并绑定了一个 OpenGL 3.3 核心配置文件兼容上下文,稍后返回的字符串 glGetString(GL_VERSION), "3.3 (Core Profile) Mesa 13.0.6" 证实了这一点。
接下来,我使用 EGL 加载 OpenGL 规范的各种函数(我选择不使用 GLEW 等库)。完成此操作后,我开始设置 OpenGL 状态以渲染普通三角形。我初始化了一个浮点数组,它们构成了我的三角形的 3 个硬编码顶点。然后,我初始化并绑定一个顶点数组对象,然后初始化并绑定一个顶点缓冲区对象。最后,我将我的顶点数组传递给 glBufferData,以将顶点数据与顶点缓冲区对象链接起来。
unsigned int vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
unsigned int vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
然后,我初始化一个基本的顶点和片段着色器。都编译成功,我的shader程序链接成功,验证成功。
#version 330 core
layout (location = 0) in vec3 p;
void main(){
gl_Position = vec4(p, 0.0);
}
#version 330 core
out vec4 color;
void main(){
color = vec4(0.0, 0.0, 0.0, 1.0);
}
然后我继续告诉 GL 如何解释我的顶点数据;
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void *)0);
glEnableVertexAttribArray(0);
最后,我进入程序的主循环,负责绘制和交换帧缓冲区,其中 bufferloop 是struct timespec bufferloop = (struct timespec){0, 250000};
while(app.running){
glClearColor(1.0, 1.0, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES, 0, 3);
eglSwapBuffers(egldisplay, eglsurface);
nanosleep(&bufferloop, (void *)0);
}
我得到的只是一个白屏;我的三角形无处可寻。我终其一生都无法确定问题所在。我已经在我的代码中粘贴了printf("%d\n", glGetError());,并且没有出现错误。
glDrawArrays(GL_TRIANGLES, 0, 3); 连偷看都失败了。
【问题讨论】:
-
您确定要在您的顶点着色器中将
w设为 0.0 而不是 1.0? -
你赢了。如果您希望我投票,请做出正确的回答。感谢您的帮助。