glDrawElements:尝试访问属性1

时间:2018-04-15 21:08:38

标签: webgl

注意:之前已经提出了一般性问题,但这种错误似乎真的取决于细节。如果这确实是重复的话,请道歉

我收到属性a_Morph_0的“超出范围”错误,尽管检查了很多内容:

  1. 该属性存在于着色器
  2. 我正在使用VAO,并尝试将其释放(设置为null)
  3. 管道适用于其他数据
  4. 之前我遇到过这个错误,只是通过从片段着色器中删除东西来修复,但这次没有帮助
  5. 切换a_Positiona_Morph_0的顺序会相应地更改错误,即它仍会引用a_Morph_0。
  6. 顶点着色器代码:

    attribute vec4 a_Position;
    attribute vec4 a_Morph_0;
    attribute vec4 a_Morph_1;
    uniform float u_MorphWeights[2];
    
    uniform mat4 u_MVPMatrix;
    uniform mat4 u_ModelMatrix;    
    
    void main() {
        vec4 m_Position = a_Position;
    
        m_Position += (u_MorphWeights[0] * a_Morph_0);
        m_Position += (u_MorphWeights[1] * a_Morph_1);
    
        gl_Position = u_MVPMatrix * m_Position;
    }
    

    一些相关数据:

    • elements的数据:Uint16Array(3)[0,1,2]
    • 属性a_Position的数据:Float32Array(9)[0,0,0,1,0,0,0.5,0,0,0]
    • 属性a_Morph_0的数据:Float32Array(9)[0,0,0,0,0,0,-1,1,0]
    • 属性a_Morph_1的数据:Float32Array(9)[0,0,0,0,0,0,1,1,0]

    抽奖调用的次数为3.具体来说:

    gl.drawElements(4, 3, 5123, 0);

    Spector的截图:

    enter image description here

    我还应该检查其他什么?

1 个答案:

答案 0 :(得分:0)

我发现了我的错误 - 如果我们查看Spector输出,变形属性有一个非零的offsetPointer,即36和72

这在我当前的实现中是不正确的,因为在将数据上传到GPU缓冲区之前,数据被切成正确的段。因此,偏移量应始终为0.