webg的shader系列(2)——三角形、webgl2

1、画一个简单的三角形

接着上节,只需要修改下面这行代码即可。

webgl.drawArrays(webgl.TRIANGLES,0,3)

最终代码

    <canvas id="container" width="800px" height="600px"></canvas>
    <script>
        const canvas=document.getElementById('container')
        var VSHADER=`
        attribute vec4 a_Position;
        varying vec4 v_color;
        void main(){
            gl_Position=a_Position;
        }
        `;
        var FSHADER=`
        precision mediump float;
        void main(){
            gl_FragColor=vec4(1.0,0.0,0.0,1.0);
        }
        `;
        let webgl=container.getContext('webgl') //获得webgl的上下文
        if(!webgl)
        {
            console.assert("该网页不支持webgl2")
        }
        if(!initShaders(webgl, VSHADER, FSHADER)){
            console.assert("初始化shader错误")
        }
        webgl.clearColor(0.0, 0.0, 0.0, 1.0) //设置背景颜色


        let a_Position= webgl.getAttribLocation(webgl.program, 'a_Position')

        let vertices=new Float32Array([0.0,0.5,-0.5,-0.5,0.5,-0.5])
        var colors = []
        webgl.clear(webgl.COLOR_BUFFER_BIT) //清除canvas的颜色
        let vertexBuffer=webgl.createBuffer()  //创建缓冲区对象
        webgl.bindBuffer(webgl.ARRAY_BUFFER,vertexBuffer)  //将缓冲区对象绑定到目标
        webgl.bufferData(webgl.ARRAY_BUFFER,vertices,webgl.STATIC_DRAW) //向缓冲区对象写入数据

        webgl.vertexAttribPointer(a_Position,2,webgl.FLOAT,false,0,0) //将缓冲区对象分配给a_Posiotion
        webgl.enableVertexAttribArray(a_Position) //连接变量a_Position和缓冲区对象

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

2、平移

    <canvas id="container" width="800px" height="600px"></canvas>
    <script>
        const canvas=document.getElementById('container')
        var VSHADER=`
        attribute vec4 a_Position;
        uniform mat4 u_zformMatrix;
        void main(){
            gl_Position=u_zformMatrix*a_Position;
        }
        `;
        var FSHADER=`
        precision mediump float;
        void main(){
            gl_FragColor=vec4(1.0,0.0,0.0,1.0);
        }
        `;
        let webgl=container.getContext('webgl') //获得webgl的上下文
        if(!webgl)
        {
            console.assert("该网页不支持webgl2")
        }
        if(!initShaders(webgl, VSHADER, FSHADER)){
            console.assert("初始化shader错误")
        }
        webgl.clearColor(0.0, 0.0, 0.0, 1.0) //设置背景颜色


        let a_Position= webgl.getAttribLocation(webgl.program, 'a_Position')

        let vertices=new Float32Array([0.0,0.5,-0.5,-0.5,0.5,-0.5])
        var colors = []
        webgl.clear(webgl.COLOR_BUFFER_BIT) //清除canvas的颜色
        let vertexBuffer=webgl.createBuffer()  //创建缓冲区对象
        webgl.bindBuffer(webgl.ARRAY_BUFFER,vertexBuffer)  //将缓冲区对象绑定到目标
        webgl.bufferData(webgl.ARRAY_BUFFER,vertices,webgl.STATIC_DRAW) //向缓冲区对象写入数据

        webgl.vertexAttribPointer(a_Position,2,webgl.FLOAT,false,0,0) //将缓冲区对象分配给a_Posiotion
        webgl.enableVertexAttribArray(a_Position) //连接变量a_Position和缓冲区对象

        let u_zformMatrix=webgl.getUniformLocation(webgl.program, 'u_zformMatrix')
        let zformMatrix=new Matrix4();
        zformMatrix.translate(0.5,0,0)
        webgl.uniformMatrix4fv(u_zformMatrix, false, zformMatrix.elements)
        webgl.drawArrays(webgl.TRIANGLES,0,3)
    </script>

3、旋转180度

只需在上面的基础上,修改矩阵即可

        let zformMatrix=new Matrix4();
        zformMatrix.setRotate(180,0,0,1)

4、缩放0.5

只需在上面的基础上,修改矩阵即可

        let zformMatrix=new Matrix4();
        zformMatrix.setScale(0.5,0.5,0.5)

5、旋转加移动

        let zformMatrix=new Matrix4(); 
        zformMatrix.setTranslate(0.5,0,0)
        zformMatrix.rotate(180,0,0,1)

6、各个顶点不同的颜色

这个要为各个顶点赋予不同的颜色需要用到varying这个关键字

    <canvas id="container" width="800px" height="600px"></canvas>
    <script>
        const canvas=document.getElementById('container')
        var VSHADER=`
        attribute vec4 a_Position;
        uniform mat4 u_zformMatrix;
        attribute vec4 a_color;
        varying vec4 v_color;
        void main(){
            gl_Position=u_zformMatrix*a_Position;
            v_color=a_color;
        }
        `;
        var FSHADER=`
        precision mediump float;
        varying vec4 v_color;
        void main(){
            gl_FragColor=v_color;
        }
        `;
        let webgl=container.getContext('webgl') //获得webgl的上下文
        if(!webgl)
        {
            console.assert("该网页不支持webgl2")
        }
        if(!initShaders(webgl, VSHADER, FSHADER)){
            console.assert("初始化shader错误")
        }
        webgl.clearColor(0.0, 0.0, 0.0, 1.0) //设置背景颜色


        //给顶点着色器的顶点赋值
        let a_Position= webgl.getAttribLocation(webgl.program, 'a_Position')
        let vertices=new Float32Array([0.0,0.5,-0.5,-0.5,0.5,-0.5])
        let vertexBuffer=webgl.createBuffer()  //创建缓冲区对象
        webgl.bindBuffer(webgl.ARRAY_BUFFER,vertexBuffer)  //将缓冲区对象绑定到目标
        webgl.bufferData(webgl.ARRAY_BUFFER,vertices,webgl.STATIC_DRAW) //向缓冲区对象写入数据
        webgl.vertexAttribPointer(a_Position,2,webgl.FLOAT,false,0,0) //将缓冲区对象分配给a_Posiotion
        webgl.enableVertexAttribArray(a_Position) //连接变量a_Position和缓冲区对象

        //给顶点的各个点赋予颜色
        let a_color= webgl.getAttribLocation(webgl.program, 'a_color')
        let colors=new Float32Array([1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0])
        let colorBuffer=webgl.createBuffer()  //创建缓冲区对象
        webgl.bindBuffer(webgl.ARRAY_BUFFER,colorBuffer)  //将缓冲区对象绑定到目标
        webgl.bufferData(webgl.ARRAY_BUFFER,colors,webgl.STATIC_DRAW) //向缓冲区对象写入数据
        webgl.vertexAttribPointer(a_color,3,webgl.FLOAT,false,0,0) //将缓冲区对象分配给a_Posiotion
        webgl.enableVertexAttribArray(a_color) //连接变量a_Position和缓冲区对象

        //旋转矩阵
        let u_zformMatrix=webgl.getUniformLocation(webgl.program, 'u_zformMatrix')
        let zformMatrix=new Matrix4()
        zformMatrix.setRotate(180,0,0,1)
        webgl.uniformMatrix4fv(u_zformMatrix, false, zformMatrix.elements)

        webgl.clear(webgl.COLOR_BUFFER_BIT) //清除canvas的颜色
        webgl.drawArrays(webgl.TRIANGLES,0,3)
    </script>

7、使用webgl2.0来重写上面的程序

webgl2.0是基于opengl es3.0来写的,所以对应的shader最好按照新的格式来书写

<canvas id="container" width="800px" height="600px"></canvas>
    <script>
        const canvas=document.getElementById('container')
        var VSHADER=`#version 300 es
        layout (location=0) in vec4 a_Position;
        layout (location=1) in vec4 a_color;
        uniform mat4 u_zformMatrix;        
        out vec4 v_color;
        void main(){
            gl_Position=u_zformMatrix*a_Position;
            v_color=a_color;
        }
        `;
        var FSHADER=`#version 300 es
        precision mediump float;
        in vec4 v_color;
        out vec4 fragColor;
        void main(){
            fragColor=v_color;
        }
        `;
        let webgl=container.getContext('webgl2') //获得webgl的上下文
        if(!webgl)
        {
            console.assert("该网页不支持webgl2")
        }
        let shaderProgram=initWebgl2Shaders(webgl, VSHADER, FSHADER)
        if(!shaderProgram){
            console.assert("初始化shader错误")
        }
        webgl.clearColor(0.0, 0.0, 0.0, 1.0) //设置背景颜色

        //给顶点着色器的顶点赋值
        let a_Position= webgl.getAttribLocation(shaderProgram, 'a_Position')
        let vertices=new Float32Array([0.0,0.5,-0.5,-0.5,0.5,-0.5])
        let vertexBuffer=webgl.createBuffer()  //创建缓冲区对象
        webgl.bindBuffer(webgl.ARRAY_BUFFER,vertexBuffer)  //将缓冲区对象绑定到目标
        webgl.bufferData(webgl.ARRAY_BUFFER,vertices,webgl.STATIC_DRAW) //向缓冲区对象写入数据
        webgl.vertexAttribPointer(a_Position,2,webgl.FLOAT,false,0,0) //将缓冲区对象分配给a_Posiotion
        webgl.enableVertexAttribArray(a_Position) //连接变量a_Position和缓冲区对象

        //给顶点的各个点赋予颜色
        let a_color= webgl.getAttribLocation(shaderProgram, 'a_color')
        let colors=new Float32Array([1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0])
        let colorBuffer=webgl.createBuffer()  //创建缓冲区对象
        webgl.bindBuffer(webgl.ARRAY_BUFFER,colorBuffer)  //将缓冲区对象绑定到目标
        webgl.bufferData(webgl.ARRAY_BUFFER,colors,webgl.STATIC_DRAW) //向缓冲区对象写入数据
        webgl.vertexAttribPointer(a_color,3,webgl.FLOAT,false,0,0) //将缓冲区对象分配给a_Posiotion
        webgl.enableVertexAttribArray(a_color) //连接变量a_Position和缓冲区对象

        //旋转矩阵
        let u_zformMatrix=webgl.getUniformLocation(shaderProgram, 'u_zformMatrix')
        let zformMatrix=new Matrix4()
        zformMatrix.setRotate(180,0,0,1)
        webgl.uniformMatrix4fv(u_zformMatrix, false, zformMatrix.elements)

        webgl.clear(webgl.COLOR_BUFFER_BIT) //清除canvas的颜色
        webgl.drawArrays(webgl.TRIANGLES,0,3)
    </script>

其中initWebgl2Shaders方法

function checkShaderCompilation(gl, shader) {
  var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
  console.log('Shader compiled successfully: ' + compiled);
  var compilationLog = gl.getShaderInfoLog(shader);
  console.log('Shader compiler log: ' + compilationLog);
};

function initWebgl2Shaders(gl,vertCode,fragCode){

  // Create a vertex shader object
  var vertShader = gl.createShader(gl.VERTEX_SHADER);

  // Attach vertex shader source code
  gl.shaderSource(vertShader, vertCode);

  // Compile the vertex shader
  gl.compileShader(vertShader);

  checkShaderCompilation(gl, vertShader);

  // Create fragment shader object
  var fragShader = gl.createShader(gl.FRAGMENT_SHADER);

  // Attach fragment shader source code
  gl.shaderSource(fragShader, fragCode);

  // Compile the fragment shader
  gl.compileShader(fragShader);

  checkShaderCompilation(gl, fragShader);

  // Create a shader program object to store
  // the combined shader program
  var shaderProgram = gl.createProgram();

  // Attach a vertex shader
  gl.attachShader(shaderProgram, vertShader);

  // Attach a fragment shader
  gl.attachShader(shaderProgram, fragShader);

  // Link both the programs
  gl.linkProgram(shaderProgram);

  // Use the combined shader program object
  gl.useProgram(shaderProgram);

  return shaderProgram;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值