请参阅“ OpenGL 着色器的显式与自动属性位置绑定”
如果我没有使用 明确绑定属性glVertexAttribPointer
,将使用哪些默认位置?
我在哪里可以找到它的官方链接?
我认为您可能混淆了几个不同的概念。您链接的问题是关于如何将位置分配给顶点着色器中的属性。glBindAttribLocation()
或glGetAttribLocation()
用于该目的。
glVertexAttribPointer()
另一方面,指定属性的数据来自何处,以及属性的一些相关状态(类型、步幅等)。它作用的特定属性由它的位置给出,它作为调用的第一个参数传递。
现在,如果您从不调用glVertexAttribPointer()
属性,则有几种可能的情况:
没有为属性启用属性数组。如果glEnableVertexAttribArray()
从未为该属性调用过或glDisableVertexAttribArray()
最后一次调用过,则会发生这种情况。在这种情况下,将使用属性的当前值,即使用类似调用设置的glVertexAttrib4f()
值,默认值为(0.0f, 0.0f, 0.0f, 1.0f)
。
如果启用了属性数组,则默认值对应于以下调用:
glVertexAttribPointer(location, 4, GL_FLOAT, GL_FALSE, 0, NULL);
所有这些都可以在官方 OpenGL 规范文档中找到,该文档可在https://www.opengl.org/registry/访问。
您是否在问如何将 GLSL 着色器中的通用属性分配给属性槽(位置)?
如果您自己不这样做,那是完全定义的实现。有些人会扫描顶点着色器并按字母顺序为其分配位置,其他人会根据它们出现的顺序为它们分配插槽,但这些行为都不是必需的。它可能是完全随机的,并且每次运行程序时都会发生变化。
这就是为什么您要么在链接之前将顶点属性显式绑定到某个位置,要么在之后查询该位置。