【问题标题】:OpenGL 4: Draw with glVertexAttribOpenGL 4:使用 glVertexAttrib 绘制
【发布时间】:2015-09-14 12:10:51
【问题描述】:

是否可以仅使用 glVertexAttrib3f 调用在 OpenGL 4+ 中进行绘制?以下在旧版 OpenGL 模式下工作,但当我切换到 OpenGL 4 时,什么都没有渲染。

glBegin(GL_TRIANGLES);
glVertexAttrib3f(1,  0, 0, -1);
glVertexAttrib3f(0, -0.5, -0.5, -0.5 );
glVertexAttrib3f(0, -0.5,  0.5, -0.5 );
glVertexAttrib3f(0,  0.5,  0.5, -0.5 );

glVertexAttrib3f(1,  0, 0, 1);
glVertexAttrib3f(0,  0.5, -0.5, 0.5 );
glVertexAttrib3f(0,  0.5,  0.5, 0.5 );
glVertexAttrib3f(0, -0.5,  0.5, 0.5 );
....
glEnd();

我想我应该摆脱那些 glBegin() glEnd() 函数,也许调用 glDrawArrays() 但没有让它工作。

【问题讨论】:

  • glBeginglEnd 在 OpenGL 4 中不存在。
  • 我相信这在兼容性配置文件中应该仍然有效。显然不是核心配置文件上下文。

标签: c++ opengl


【解决方案1】:

glBegin/glEnd 是已弃用的旧功能,自 3.1 版起,它们不再是 OpenGL 核心配置文件的一部分。简而言之,它们不应该再使用了。尽管如此,如果你想使用它们,你可以,但在这种情况下,你必须在你的 OpenGL 上下文中使用compatibility profile,否则它们是不受支持的。

如果您使用GLFW 来创建上下文和窗口,您可以在context creation 处设置兼容性配置文件,并提供以下提示:

glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_COMPAT_PROFILE);

我强烈推荐以下教程网站

了解现代 OpenGL 的功能和用法。

【讨论】:

  • 你是对的,但 glBegin/glEnd 已被弃用。在不推荐使用立即模式渲染 (glBegin/glEnd) 后,glVertexAttrib* 函数仅提供我在已删除答案中解释的“默认顶点常量”功能。
【解决方案2】:

在 OpenGL 3.3 及更高版本(甚至可能只有 3.0 及更高版本?)中,如果不明确指定着色器程序,您将无法绘制任何内容。

另外,在 OpenGL ES 2.0 中你需要这个。

OpenGL: What's the deal with deprecation?

Does OpenGL ES 2.0 require a shader for any vertex rendering?

【讨论】:

  • 实际上我正在使用着色器,上面的方法在 OpenGL 4 之前使用着色器可以正常工作,并且从我看到的 glVertexAttrib3f 没有被弃用。
  • 是的,vertexAttrib3f 没有被弃用,但我不确定你在 glBegin ... glEnd 旁边说“仅...调用”时的意思
猜你喜欢
  • 1970-01-01
  • 2021-01-16
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 2017-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多