gpt4 book ai didi

opengl - glEnableClientState 与现代 OpenGL(glVertexAttribPointer 等)

转载 作者:行者123 更新时间:2023-12-04 02:53:58 25 4
gpt4 key购买 nike

我想列出一些我认为我已经学到的东西,但我不确定:

  • VBO是要走的路。它们是用 glGenBuffers 创建的和 glBufferData .
  • 为了获得最大的灵活性,最好使用 glVertexAttribPointer 将通用顶点属性传递给着色器。 , 而不是 glVertex , glNormal等。
  • glDrawElements可以与顶点缓冲区和索引缓冲区一起使用,以有效地渲染具有大量共享顶点的几何体,例如景观网格。

  • 假设到目前为止所有这些都是正确的,这是我的问题。我读过的所有关于现代 OpenGL 的教程都完全省略了 glEnableClientState .但是 OpenGL 手册页说没有 glEnableClientState , glDrawElements什么都不做:

    http://www.opengl.org/sdk/docs/man/xhtml/glDrawElements.xml

    关键段落是:“如果未启用 GL_VERTEX_ARRAY,则不会构造几何图元。”

    这使我想到以下问题:
  • 没有一个教程使用 glEnableClientState调用前 glDrawElements .这是否意味着手册页错误或过时?
  • GL_VERTEX_ARRAY如果您要使用 glVertexPointer,这似乎是您启用的功能。 ,同样你会使用 GL_NORMAL_ARRAYglNormalPointer , 等等。但是如果我不使用这些函数,而是使用带有 glVertexAttribPointer 的通用顶点属性,那么为什么要启用 GL_VERTEX_ARRAY ?
  • 最佳答案

    If GL_VERTEX_ARRAY is not enabled, no geometric primitives are constructed.



    那是因为手册页是错误的。手册页涵盖了 GL 2.1(它仍然是错误的),无论出于何种原因,更新手册页的人都拒绝更新旧的 GL 版本以修复错误。

    在 GL 2.1 中,您必须使用通用属性索引 0 或 GL_VERTEX_ARRAY .在 GL 3.1+ 中,您不需要使用任何特定的属性索引。

    这是因为,在 3.1 之前的 GL 版本中,所有数组渲染函数都是根据对 glArrayElement 的调用定义的。 ,它使用了基于即时模式的渲染。这意味着你需要一些东西来激发顶点。回想一下,在立即模式下,调用 glVertex*()不仅设置顶点位置,它还使顶点与其他属性一起发送。调用 glVertexAttrib*(0, ...)做同样的事情。这就是为什么旧版本要求您使用属性 0 或 GL_VERTEX_ARRAY 的原因。 .

    在 GL 3.1+ 中,一旦他们取消了立即模式,他们就必须以不同的方式指定数组渲染。正因为如此,他们不必限制自己使用属性 0。

    如果你想要核心 GL 3.3 的 API 文档,我建议你查看 the actual API docs for core GL 3.3 .老实说,如果您想要准确的信息,我只会查看规范。这些文档中有很多错误信息。而且由于它们实际上不是维基页面,因此这些信息永远不会得到纠正。

    关于opengl - glEnableClientState 与现代 OpenGL(glVertexAttribPointer 等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8550179/

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