【问题标题】:OpenGL 3.3 Core profile - glDrawArrays fails silentlyOpenGL 3.3 核心配置文件 - glDrawArrays 静默失败
【发布时间】: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?
  • 你赢了。如果您希望我投票,请做出正确的回答。感谢您的帮助。

标签: c opengl


【解决方案1】:

在您的顶点着色器中,w 组件应该是 1 而不是 0。OpenGL 红皮书here 中有一个很好的描述,它描述了如何使用w。简要说明:

OpenGL 命令通常处理二维和三维顶点,但实际上它们在内部都被视为包含四个坐标的三维齐次顶点。每个列向量 (x, y, z, w)T 如果至少有一个元素不为零,则表示一个齐次顶点。

只要w不为零,齐次顶点(x,y,z,w)T对应三维点(x/w,y/w,z/w)T。如果 w = 0.0,它对应的不是欧几里得点,而是某个理想化的“无穷远点”。要理解这个无穷远点,请考虑点 (1, 2, 0, 0),并注意点 (1, 2, 0, 1)、(1, 2, 0, 0.01) 和 (1) 的序列, 2.0, 0.0, 0.0001),对应欧几里得点 (1, 2), (100, 200), 和 (10000, 20000)。该序列表示沿线 2x = y 快速向无穷大移动的点。因此,您可以将 (1, 2, 0, 0) 视为该直线方向上的无穷远点。

【讨论】:

    猜你喜欢
    • 2012-10-14
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多