0

请参阅“ OpenGL 着色器的显式与自动属性位置绑定

如果我没有使用 明确绑定属性glVertexAttribPointer,将使用哪些默认位置?

我在哪里可以找到它的官方链接?

4

2 回答 2

0

我认为您可能混淆了几个不同的概念。您链接的问题是关于如何将位置分配给顶点着色器中的属性。glBindAttribLocation()glGetAttribLocation()用于该目的。

glVertexAttribPointer()另一方面,指定属性的数据来​​自何处,以及属性的一些相关状态(类型、步幅等)。它作用的特定属性由它的位置给出,它作为调用的第一个参数传递。

现在,如果您从不调用glVertexAttribPointer()属性,则有几种可能的情况:

  1. 没有为属性启用属性数组。如果glEnableVertexAttribArray()从未为该属性调用过或glDisableVertexAttribArray()最后一次调用过,则会发生这种情况。在这种情况下,将使用属性的当前值,即使用类似调用设置的glVertexAttrib4f()值,默认值为(0.0f, 0.0f, 0.0f, 1.0f)

  2. 如果启用了属性数组,则默认值对应于以下调用:

    glVertexAttribPointer(location, 4, GL_FLOAT, GL_FALSE, 0, NULL);
    
    1. 如果你有一个 VBO 限制,这可能是有效的,因为最后一个参数是缓冲区的相对偏移量。
    2. 如果您没有 VBO 绑定,则绘图调用很可能会崩溃,因为它会尝试从给定的指针地址获取顶点数据,该地址为 NULL。

所有这些都可以在官方 OpenGL 规范文档中找到,该文档可在https://www.opengl.org/registry/访问。

于 2014-11-07T06:48:51.763 回答
0

您是否在问如何将 GLSL 着色器中的通用属性分配给属性槽(位置)?

如果您自己不这样做,那是完全定义的实现。有些人会扫描顶点着色器并按字母顺序为其分配位置,其他人会根据它们出现的顺序为它们分配插槽,但这些行为都不是必需的。它可能是完全随机的,并且每次运行程序时都会发生变化。

这就是为什么您要么在链接之前将顶点属性显式绑定到某个位置,要么在之后查询该位置。

于 2014-11-07T01:30:26.510 回答