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

时间:2015-04-24 06:43:48

标签: opengl attributes glsl vertex-shader pixel-shader

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

如果顶点缓冲区没有顶点着色器用于OpenGL的属性,会发生什么?

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

实施例

vb只有:position

顶点着色器:

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 个答案:

答案 0 :(得分:3)

有两种情况:

  1. 如果启用了属性数组(即为属性调用了glEnableVertexAttribArray()),但您没有进行glVertexAttribPointer()调用,指定数据在有效的VBO中,坏事可能发生。我相信它可以依赖于实现的结果。例如,绘制调用可能会崩溃,或者可能存在垃圾渲染。我能在规范中找到的最好的东西是:

      

    大多数但不是所有在缓冲区对象上运行的GL命令都会检测到读取或写入绑定缓冲区对象中某个位置的尝试,其偏移量小于零,或者大于或等于缓冲区的大小。当检测到这种尝试时,将产生GL错误。任何未检测到这些尝试并执行此类无效读取或写入的命令都具有未定结果,并可能导致GL中断或终止。

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