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

时间:2014-11-07 01:09:42

标签: opengl vertex-shader vertex-attributes

请参阅“Explicit vs Automatic attribute location binding for OpenGL shaders

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

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分: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。
  3. 所有这些都可以在官方OpenGL规范文档中找到,可以在https://www.opengl.org/registry/访问。