如果顶点属性与顶点着色器输入不匹配会发生什么

What happens if Vertex Attributes not match Vertex Shader Input

据我所知,如果顶点缓冲区有着色器不使用的属性,则不会有问题。

如果顶点缓冲区没有顶点着色器用于 OpenGL 的属性会怎样?

我知道对于 DirectX11,如果顶点缓冲区中没有提供着色器所需的属性,则不会绘制任何内容。

例子

vb只有:位置

顶点着色器:

attribute vec3 position;
attribute vec4 color;
varying vec4 out_color;
void main()
{
  gl_Position = vec4(position, 1.0);
  out_color = color;
}

像素着色器:

varying vec4 out_color;
void main()
{
  gl_FragColor = vertex_color;
}

着色器执行后的像素颜色是什么?

有两种情况:

  1. 如果启用了属性数组(即为属性调用了 glEnableVertexAttribArray()),但您没有进行指定数据的 glVertexAttribPointer() 调用一个有效的 IBO,可能会发生坏事。我相信这可能取决于具体的结果是什么。例如,绘图调用可能会崩溃,或者可能出现垃圾渲染。我能在规范中找到的最好的东西是:

    Most, but not all GL commands operating on buffer objects will detect attempts to read from or write to a location in a bound buffer object at an offset less than zero, or greater than or equal to the buffer’s size. When such an attempt is detected, a GL error will be generated. Any command which does not detect these attempts, and performs such an invalid read or write, has undefined results, and may result in GL interruption or termination.

  2. 如果不启用属性数组,则当前属性值用于所有顶点。这是使用 glVertexAttrib4fv() 和类似调用设置的值。如果没有进行此类调用,则当前属性值的默认值为 (0.0, 0.0, 0.0, 1.0)。