webgl学习六 纹理贴图

2020-11-23  本文已影响0人  MrSwilder
<html>

<head>
    <title>
        纹理贴图
    </title>
    <script type="text/javascript" src="./lib/webgl-debug.js"></script>
    <script type="text/javascript" src="./lib/webgl-utils.js"></script>
    <script type="text/javascript" src="./lib/cuon-utils.js"></script>
    <script type="text/javascript" src="./lib/cuon-matrix.js"></script>
</head>

<body onload="main()">
    <canvas id='canvas' width="1920" height="1080"></canvas>
    <script type="text/javascript">
        //定义变量存储位置
        //attribute:存储顶点位置,经常变的,无精度限定
        //uniform:存储不变的值,有精度限定
        var VShader =
            "attribute vec4 a_position;\n" +
            "attribute vec2 a_texurecoord;\n"+
            "varying vec2 v_textureCoord;\n"+
            "void main(){\n" +
            "gl_Position=a_position;" +
            "gl_PointSize=10.0;\n" +
            "v_textureCoord=a_texurecoord;\n"+
            "}"


        var FShader =
            "precision mediump float;\n" +
            "uniform sampler2D u_sampler;\n"+
            "varying vec2 v_textureCoord\n;"+
            "void main(){\n" +
                "gl_FragColor=texture2D(u_sampler,v_textureCoord);\n" +

            "}"


        function main() {
            var canvas = document.getElementById("canvas");
            var gl = getWebGLContext(canvas);
            if (!gl) {
                console.log("获取webgl上下文失败")
                return;
            }
            if (!initShaders(gl, VShader, FShader)) {
                console.log("初始化着色器失败");
                return;
            }
            //获取着色器中的变量的地址
            var a_position = gl.getAttribLocation(gl.program, 'a_position')
            if (a_position < 0) {
                console.log("获取a_position变量地址失败")
                return;
            }

            var a_texurecoord = gl.getAttribLocation(gl.program, 'a_texurecoord')
            if (a_texurecoord < 0) {
                console.log("获取a_texurecoord变量地址失败")
                return;
            }





            initVertexBuffer(gl, a_position,a_texurecoord);
            initTexture()


         
          
               //初始化纹理贴图
            function initTexture() {
                //创建纹理
                var texture=gl.createTexture();
                //获取纹理坐标的存储地址
                var u_Sampler=gl.getUniformLocation(gl.program,"u_sampler");
                console.log(u_Sampler)
                var image=new Image();
               
                image.onload=function(){
                    loadTexture(gl,texture,image,u_Sampler);
                }
                image.src="./img/ff.png"

            }





        }


        function loadTexture(gl,texture,image,u_Sampler){
            //进行y轴翻转
            gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL,1);
            //开启0号纹理单元
            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);
            //将0号纹理传递给着色器
            gl.uniform1i(u_Sampler,0)
            gl.clearColor(0, 0, 0, 1)
            gl.clear(gl.COLOR_BUFFER_BIT)
            gl.drawArrays(gl.TRIANGLES, 0, 6)
        }


     


        //初始化颜色缓冲区
        function initVertexBuffer(gl, a_position,a_texurecoord) {
            var vertexs = new Float32Array([
                1.0, 1.0, 0.0,1,1,
                -1.0, 1.0, 0.0,0,1, 
                -1.0, -1.0, 0.0,0,0, 
                -1.0, -1.0, 0.0,0,0, 
                1.0, -1.0, 0.0,1,0, 
                1.0, 1.0, 0.0,1,1
            ])

            //计算所占字节数
            var fsize = vertexs.BYTES_PER_ELEMENT;

            //创建缓冲区
            var vextexBuffer = gl.createBuffer();
            if (!vextexBuffer) {
                console.log("创建缓冲区失败")
                return;
            }
            //绑定到顶点缓冲区
            gl.bindBuffer(gl.ARRAY_BUFFER, vextexBuffer);
            //给顶点缓冲区传值,GL_STATIC_DRAW表示数据变得很少
            gl.bufferData(gl.ARRAY_BUFFER, vertexs, gl.STATIC_DRAW);
            //将顶点缓冲区的值给a_position变量
            gl.vertexAttribPointer(a_position, 3, gl.FLOAT, false, fsize * 5, 0);
            gl.enableVertexAttribArray(a_position)



           

            gl.vertexAttribPointer(a_texurecoord, 2, gl.FLOAT, false, fsize * 5, fsize * 3);
             //开启顶点缓冲区中的Attribute类型变量a_position
             gl.enableVertexAttribArray(a_texurecoord)



        }
    </script>
</body>

</html>

效果:


图片.png
上一篇下一篇

猜你喜欢

热点阅读