为什么调用 glEnableVertexPointer 和 glVertexPointer 会导致 InvalidValue?

Why does this call of glEnableVertexPointer and glVertexPointer cause InvalidValue?

我正在创建一个包含基本游戏需求的游戏引擎。使用 glslDevil,事实证明我的绑定 VBO 方法抛出 InvalidValue 错误。调用 glVertexPointer 和调用 glEnableVertexPointer 会导致问题。顶点属性索引导致了这个问题。索引是 4294967295,远远超过 15。其他一切都很好。我正在使用 OpenTK。这是绑定到属性的方法。

public void BindToAttribute(ShaderProgram prog, string attribute)
    {
        int location = GL.GetAttribLocation(prog.ProgramID, attribute);
        GL.EnableVertexAttribArray(location);
        Bind();
        GL.VertexAttribPointer(location, Size, PointerType, true, TSize, 0);
    }
public void Bind()
    {
        GL.BindBuffer(Target, ID);
    }

如果需要,这是我的着色器。

顶点着色器:

uniform mat4 transform;
uniform mat4 projection;
uniform mat4 camera;
in vec3 vertex;
in vec3 normal;
in vec4 color;
in vec2 uv;
out vec3 rnormal;
out vec4 rcolor;
out vec2 ruv;

void main(void)
{
    rcolor = color;
    rnormal = normal;
    ruv = uv;
    gl_Position = camera * projection * transform * vec4(vertex, 1);
}

片段着色器:

in vec3 rnormal;
in vec4 rcolor;
in vec2 ruv;
uniform sampler2D texture;

void main(void)
{
    gl_FragColor = texture2D(texture, ruv) * rcolor;
}

是我没有正确获取索引还是有其他问题?

您获得的索引似乎是问题所在:这是当 opengl 找不到具有该名称的有效 attribute/uniform 时您获得的索引。

可能会发生一些事情:

  • 您传递的字符串在着色器程序中不存在(检查是否区分大小写等)
  • 制服存在并且您传递了正确的字符串,但您没有在着色器中使用该属性,因此驱动程序由于优化而删除了最终代码中所有出现的该属性(因此它没有存在了)

但一般来说,该数字表明 OpenGL 无法找到您正在寻找的制服或属性

编辑:

一个技巧如下:假设您有一些像素着色器代码,returns一个值是许多值的总和:

out vec4 color;

void main()
{
    // this shader does many calculations when you are 
    // using many values, but let's assume you want to debug 
    // just the diffuse color... how do you do it?
    // if you change the output to return just the diffuse color, 
    // the optimizer might remove code and you might have problems
    // 
    // if you have this
    color = various_calculation_1 + various_calculation_2 + ....;
    // what you can do is the following
    color *= 0.0000001f;  // so basically it's still calculated 
                          // but it almost won't show up
    color += value_to_debug; // example, the diffuse color
}