zoukankan      html  css  js  c++  java
  • webgl复习笔记——纹理装配

    let canvas = document.getElementById('webgl');
    let gl = canvas.getContext('webgl');
    
    let v_shader = `
        attribute vec4 a_Position;
        attribute vec2 a_TexCoord;
        varying vec2 v_TexCoord;
        void main(){
            gl_Position =  a_Position;
            v_TexCoord = a_TexCoord;
        }
    `;
    let f_shader = `
    #ifdef GL_ES
    precision mediump float;
    #endif
        uniform sampler2D u_Sampler0;
        uniform sampler2D u_Sampler1;
        varying vec2 v_TexCoord;
        void main(){
            vec4 color0 = texture2D(u_Sampler0,v_TexCoord);
            vec4 color1 = texture2D(u_Sampler1,v_TexCoord);
            gl_FragColor = color0 * color1;
        }
    `;
    
    
    function initProgram() {
        let vshader = gl.createShader(gl.VERTEX_SHADER);
        let fshader = gl.createShader(gl.FRAGMENT_SHADER);
        gl.shaderSource(vshader, v_shader);
        gl.shaderSource(fshader, f_shader);
        gl.compileShader(vshader);
        gl.compileShader(fshader);
    
        let program = gl.createProgram();
        gl.attachShader(program, vshader);
        gl.attachShader(program, fshader);
        gl.linkProgram(program);
        gl.useProgram(program);
        gl.program = program;
    };
    
    function initBuffer() {
        let points = new Float32Array([
                -0.5, 0.5, 0, 1,
               -0.5, -0.5, 0, 0,
               0.5, 0.5, 1,1,
               0.5, -0.5, 1, 0.0,
        ]);
        let buffer = gl.createBuffer();
        gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
        gl.bufferData(gl.ARRAY_BUFFER, points, gl.STATIC_DRAW);
    
        let size = points.BYTES_PER_ELEMENT;
        let nodeLen = 4;
    
        let a_Position = gl.getAttribLocation(gl.program, 'a_Position');
        gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, size*nodeLen, 0);
        gl.enableVertexAttribArray(a_Position);
    
        let a_TexCoord = gl.getAttribLocation(gl.program, 'a_TexCoord');
        gl.vertexAttribPointer(a_TexCoord, 2, gl.FLOAT, false, size*nodeLen, size*2);
        gl.enableVertexAttribArray(a_TexCoord);
    
        return points.length / nodeLen;
    }
    
    function loadTexture(gl, n, texture, u_Sampler, image,index){
        gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, 1);//对纹理图像进行y轴反转
        //开启0号纹理单元
        if(index == 0){
            gl.activeTexture(gl.TEXTURE0);
            imgLoaded0 = true;
        }
        else {
            gl.activeTexture(gl.TEXTURE1);
            imgLoaded1 = true;
        }
        //向target绑定纹理对象
        gl.bindTexture(gl.TEXTURE_2D, texture);
    
        //配置纹理参数
        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);
        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);
        //配置纹理图像
        gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, image);
        //将0号纹理传递给着色器
        gl.uniform1i(u_Sampler, index);
        
        if(imgLoaded0 && imgLoaded1){
            draw();
        }
    }
    let imgLoaded0 = false;
    let imgLoaded1 = false;
    function draw(){
        gl.clearColor(0, 0, 0, 1.0);
        gl.clear(gl.COLOR_BUFFER_BIT);
        gl.drawArrays(gl.TRIANGLE_STRIP, 0, vertex_num);//绘制矩形
    }
    function initTextures(gl, n) {
        var texture0 = gl.createTexture(); //创建纹理对象
        //获取u_Sampler的存储位置
        var u_Sampler0 = gl.getUniformLocation(gl.program, 'u_Sampler0');
        var image0 = new Image();//创建一个image对象
    
        //注册图像加载时间的响应函数
        image0.onload = function () {
            loadTexture(gl, n, texture0, u_Sampler0, image0,0);
        };
    
        //浏览器开始加载图像
        image0.src = './sky.jpg';
        var texture1 = gl.createTexture(); //创建纹理对象
        //获取u_Sampler的存储位置
        var u_Sampler1 = gl.getUniformLocation(gl.program, 'u_Sampler1');
        var image1 = new Image();//创建一个image对象
    
        //注册图像加载时间的响应函数
        image1.onload = function () {
            loadTexture(gl, n, texture1, u_Sampler1, image1,1);
        };
    
        //浏览器开始加载图像
        image1.src = './circle.gif';
        return true;
    }
    
    initProgram();
    let vertex_num = initBuffer();
    
    initTextures(gl,vertex_num);
    
  • 相关阅读:
    python等缩进语言的词法分析实现
    收集Android程序测试代码覆盖率
    对语言之争的看法
    关于asmlinkage
    洛谷 P4171 [JSOI2010] 满汉全席(2sat)
    Codeforces Round #748 (Div. 3)解题报告
    洛谷 P1712 [NOI2016] 区间(尺取法、线段树)
    洛谷 P4782 【模板】2SAT 问题
    洛谷 P3513 [POI2011]KONConspiracy(2sat方案数)
    梦见和深爱的女孩牵着手,竟然从梦中幸福惊醒,醒后一片悲伤~~
  • 原文地址:https://www.cnblogs.com/wyy5552/p/13969068.html
Copyright © 2011-2022 走看看