以下用webgl画一个有纹理的三角形为什么会报错?

<!DOCTYPE html>
<html>
<head>
    <title>test</title>
    <!-- 顶点着色器 -->
    <script type='x-shader/x-vertex' id='shader-vs'>
        attribute vec4 a_Position;
        attribute vec2 a_TextCoord;

        varying vec2 v_TexCoord;

        void main(){
            gl_Position=a_Position;
            v_TexCoord = a_TextCoord;
        }
    </script>
    <!-- 片段着色器 -->
    <script type='x-shader/x-fragment' id='shader-fs'>
        precision mediump float;

        uniform sampler2D u_Sampler;

        varying vec2 v_TexCoord;

        void main(){
            gl_FragColor=texture2D(u_Sampler,v_TexCoord);
        }
    </script>
</head>
<body>
    <canvas id='webgl' width='400' height='400'>
        
    </canvas>
</body>
<script>
    var canvas = document.getElementById('webgl');
    var gl = canvas.getContext('webgl');

    // 2.清空屏幕
    gl.clearColor(1,1, 1, 1.0);
    gl.clear(gl.COLOR_BUFFER_BIT);

    // 3.初始化着色器
    var vs_source = document.getElementById('shader-vs').innerHTML,
        fs_source = document.getElementById('shader-fs').innerHTML;

    // 创建顶点着色器对象
    var vertexShader = gl.createShader(gl.VERTEX_SHADER);
    // 绑定资源
    gl.shaderSource(vertexShader, vs_source);
    // 编译着色器
    gl.compileShader(vertexShader);

    var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
    gl.shaderSource(fragmentShader, fs_source);
    gl.compileShader(fragmentShader);

    // 创建一个着色器程序
    var glProgram = gl.createProgram();

    // 把前面创建的二个着色器对象添加到着色器程序中
    gl.attachShader(glProgram, vertexShader);
    gl.attachShader(glProgram, fragmentShader);

    // 把着色器程序链接成一个完整的程序
    gl.linkProgram(glProgram);

    // 使用这个完整的程序
    gl.useProgram(glProgram);

    var vertexBuffer = gl.createBuffer();
    gl.bindBuffer(gl.ARRAY_BUFFER,vertexBuffer);
    var tempData = new Float32Array([
        0.0, 0.5,  10.0,
        -0.5, -0.5, 20.0,
        -0.5, 0.5,30.0
        ]);
    gl.bufferData(gl.ARRAY_BUFFER,tempData,gl.STATIC_DRAW);
    var FSIZE = tempData.BYTES_PER_ELEMENT;
    //console.log(FSIZE);
    var a_Position = gl.getAttribLocation(glProgram,'a_Position');
    gl.vertexAttribPointer(a_Position,2,gl.FLOAT,false,FSIZE*3,0);
    gl.enableVertexAttribArray(a_Position);
    
    var a_TextCoord  = gl.getAttribLocation(glProgram,'a_TextCoord');
    gl.vertexAttribPointer(a_TextCoord,2,gl.FLOAT,false,FSIZE*3,FSIZE*2);
    gl.enableVertexAttribArray(a_TextCoord)
    
    var texture = gl.createTexture();
    var u_Sampler = gl.getUniformLocation(glProgram,'u_Sampler');
    var image = new Image();
    image.crossOrigin = "anonymous";
    image.onload = function(){
        loadText(gl,3,texture,u_Sampler,image);
    }
    image.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAYAAABIdFAMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAHhJREFUeNo8zjsOxCAMBFB/KEAUFFR0Cbng3nQPw68ArZdAlOZppPFIBhH5EAB8b+Tlt9MYQ6i1BuqFaq1CKSVcxZ2Acs6406KUgpt5/LCKuVgz5BDCSb13ZO99ZOdcZGvt4mJjzMVKqcha68iIePB86GAiOv8CDADlIUQBs7MD3wAAAABJRU5ErkJggg%3D%3D";

    function loadText(gl,n,texture,u_Sampler,image){
        gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL,1);
        gl.activeTexture(gl.TEXTURE0);
        gl.bindTexture(gl.TEXTURE_2D,texture);
        gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR);
        gl.texImage2D(gl.TEXTURE_2D,0,gl.RGB,gl.RGB,gl.UNSIGNED_BYTE,image);
        gl.uniform1i(u_Sampler,0);
        gl.clear(gl.COLOR_BUFFER_BIT);
        gl.drawArrays(gl.TRIANGLE,0,3);
    }

    // gl.drawArrays(gl.TRIANGLES, 0, 3)
    </script>
</html>

错误信息:
[.WebGL-0x7f7fdf84f400]GL ERROR :GL_INVALID_OPERATION : glDrawArrays: attempt to access out of range vertices in attribute 0

阅读 847
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题