zoukankan      html  css  js  c++  java
  • WebGL入门教程(四)-webgl颜色

    前面文章:

    WebGL入门教程(一)-初识webgl

    WebGL入门教程(二)-webgl绘制三角形

    WebGL入门教程(三)-webgl动画

    颜色效果图:

    操作步骤:

      1.创建HTML5 canvas

      2.获取画布 canvas 的 ID

      3.获取WebGL

      4.编译着色器

      5.使用缓冲区对象向顶点传入多个顶点数据

      6.绘制图像

    以上1~3参考:http://www.cnblogs.com/bsman/p/6128447.html

    4.编译着色器

    改顶点着色器,片着色器

    //顶点着色器程序
        var VSHADER_SOURCE =
            "attribute vec4 a_Position;" +
            "attribute vec4 a_Color;" +
            "varying vec4 v_Color;" +
            "void main(){" +
            "gl_Position = a_Position;" +
            "v_Color = a_Color;" +
             "}";
    
        //片元着色器
        var FSHADER_SOURCE =
            "precision mediump float;" +
            "varying vec4 v_Color;" +
             "void main() {" +
             "gl_FragColor = v_Color;" +
             "}";

    解释:定义修改颜色的变量 varying,其中"v_Color = a_Color;" 表示将颜色数据传给片元着色器;"gl_FragColor = v_Color;"表示从顶点着色器接收数据;

     5.使用缓冲区对象向顶点传入多个顶点数据

    function initBuffers(gl,shaderProgram) {
      //顶点坐标和颜色
        var vertices = new Float32Array([
            0.0, 0.5, 1.0, 0.0, 0.0,
           -0.5, -0.5, 0.0, 1.0, 0.0,
            0.5, -0.5, 0.0, 0.0, 1.0,
        ]);
        var n = 3;//点的个数
        //创建缓冲区对象
        var vertexBuffer = gl.createBuffer();
    
        //将缓冲区对象绑定到目标
        gl.bindBuffer(gl.ARRAY_BUFFER,vertexBuffer);
        //向缓冲区写入数据
        gl.bufferData(gl.ARRAY_BUFFER,vertices,gl.STATIC_DRAW);
        //获取单个字节
        var FSIZE = vertices.BYTES_PER_ELEMENT;
    
        //获取坐标点
        var a_Position = gl.getAttribLocation(shaderProgram, 'a_Position');
        //将缓冲区对象分配给a_Position变量
        gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, FSIZE*5, 0);
        //连接a_Position变量与分配给它的缓冲区对象
        gl.enableVertexAttribArray(a_Position);
    
    
        //获取Color坐标点
        var a_Color = gl.getAttribLocation(shaderProgram, 'a_Color');
        //将缓冲区对象分配给a_Position变量
        gl.vertexAttribPointer(a_Color, 3, gl.FLOAT, false, FSIZE*5, FSIZE*2);
        //连接a_Position变量与分配给它的缓冲区对象
        gl.enableVertexAttribArray(a_Color);
        return n;
    }

    其中 vertexAttribPointer 方法注意此时数组中有多种数据,有坐标和颜色,此时就应该修改第五个(跨度)和第六个参数(位移)的值

    第一个参数:指定待分配attribute变量的存储位置

    第二个参数:指定缓存区中每个顶点的分量个数(1~4)

    第三个参数:类型有,gl.UNSIGNED_BYTE无符号字节,gl.SHORT短整数,gl.UNSIGNED_SHORT无符号短整数,gl.INT整型,gl.UNSIGNED_INT无符号整型,gl.FLOAT浮点型。

    第四个参数:表示是否将非浮点型的数据归到[0,1][-1,1]区间

    第五个参数:相邻两个顶点的字节数。默认为0

    第六个参数:表示缓存区对象的偏移量(以字节为单位),就是attribute变量从缓冲区中的何处开始存储。

    6.绘制图像

     var n = initBuffers(gl,shaderProgram);
    
        if(n<0){
            console.log('Failed to set the positions');
            return;
        }
        // 清除指定<画布>的颜色
        gl.clearColor(0.0, 0.0, 0.0, 1.0);
    
        // 清空 <canvas>
        gl.clear(gl.COLOR_BUFFER_BIT);
    
        gl.drawArrays(gl.TRIANGLES, 0, n);
  • 相关阅读:
    flask -服务端项目搭建
    蓝图 Blueprint
    flask-session
    flask-数据库操作 / ORM/Flask-SQLAlchemy/数据表操作/数据操作/数据库迁移
    在 Flask 项目中解决 CSRF 攻击
    Flask-Script 扩展/自定义终端命令/Jinja2模板引擎
    Flask项目创建/http的会话控制/Cookie/Session/请求钩子/异常捕获/context
    redtiger sql injection 练习
    流畅的python--序列构成的数组
    流畅的python--python的数据模型
  • 原文地址:https://www.cnblogs.com/bsman/p/6183110.html
Copyright © 2011-2022 走看看