网页高性能图形编程(四)-WebGL颜色-使用着色器绘制多顶点颜色的三角图形 & 操作部骤-顶点着色器和片段着色器 & 着色器编译羽图像绘制-vertexAttribPointer 方法

第5章-WebGL颜色

01-操作步骤介绍

在这里插入图片描述

  • 颜色添加步骤

    1. 顶点着色器中定义一个接收外部传入颜色值的属性变量a_Color和用于传输获取到的颜色值变量v_Color
    2. 片段着色器中定义一个同一类型和名称的v_Color变量接收传顶点传入的值。
    3. 重新传入到顶点坐标和颜色值的类型化数组
    4. 将数组值传入缓存中并取出,赋值给顶点的两个变量
    5. 接收缓存值并绘制图形和颜色
  • vertexAttribPointer 方法

  • 参数说明
    第1个参数指定待分配attribute变量的存储位置
    第2个参数指定缓存区中每个顶点的分量个数(1~4)
    第3个参数类型有,无符号字节,短整数,无符号短整数,整型,无符号整型,浮点型
    第4个参数表示是否将非浮点型的数据归到[0,1][-1,1]区间
    第5个参数相邻两个顶点的字节数。默认为0
    第6个参数表示缓存区对象的偏移量(以字节为单位),attribute 变量从缓冲区中的何处开始存储
  • 案例实现

    1. 添加画布元素,并获取webGL对象,保存在变量中。
    2. 定义着色器内容,并进行附件编译。
    3. 使用缓存对象向顶点传入多个坐标数据。
    4. 根据坐标数据绘制图像。

02-着色器编译与图像绘制

  • 代码实现
实例-使用着色器绘制多顶点颜色的三角图形
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <canvas id="cvs"
            width="200"
            height="200"
            style="border: dashed 1px red">
        你的浏览器不支持画布元素
    </canvas>
    <script type="text/javascript">
        //获取画布元素
        var cvs=document.getElementById("cvs");
        //获取到元素的上下文环境对象
        var gl=cvs.getContext('webgl');
        
        //顶点着色器变量
        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 ;' +

           '}';

        //新建一个用于装顶点字符串的着色器对象
        var vertShader = gl.createShader(gl.VERTEX_SHADER);
        //加载保存好的顶点代码字符串变量
        gl.shaderSource(vertShader, VSHADER_SOURCE);
        //编译顶点着色器
        gl.compileShader(vertShader);

        //新建一个用于装片段字符串的着色器对象
        var fragShader = gl.createShader(gl.FRAGMENT_SHADER);
        //加载保存好的片段代码字符串变量
        gl.shaderSource(fragShader, FSHADER_SOURCE);
        //编译片段着色器
        gl.compileShader(fragShader);

        //新建一个程序
        var shaderProgram = gl.createProgram();

        //分别附加两个已编译好的着色器对象
        gl.attachShader(shaderProgram, vertShader);
        gl.attachShader(shaderProgram, fragShader);
        
        //链接两个附件加好的着色器程序
        gl.linkProgram(shaderProgram);
        //开启程序的使用
        gl.useProgram(shaderProgram);
        //定义一个类型数组保存顶点坐标值
        var vertices = new Float32Array([
            //  x,   y,   red, green, blue
                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 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');
        //将坐标值赋值给变量
        gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, FSIZE*5, 0);
        //开启变量值的使用
        gl.enableVertexAttribArray(a_Position);

        //获取到顶点着色器中变量
        var a_Color = gl.getAttribLocation(shaderProgram, 'a_Color');
        //将坐标值赋值给变量
        gl.vertexAttribPointer(a_Color, 3, gl.FLOAT, false, FSIZE*5, FSIZE*2);
        //开启变量值的使用
        gl.enableVertexAttribArray(a_Color);

        //绘制指定位置的图形
        gl.drawArrays(gl.TRIANGLES, 0, 3); 
        
    </script>
</body>
</html>

效果-多顶点颜色

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WebGL是一种用于在Web浏览器中绘制3D图形的技术。要绘制多边形,你需要定义顶点数据,并使用WebGL绘制函数将其绘制到画布上。 以下是一个使用WebGL绘制三角形的示例: ```javascript // 获取画布元素 var canvas = document.getElementById("myCanvas"); // 获取WebGL上下文 var gl = canvas.getContext("webgl"); // 定义顶点数据 var vertices = [ -0.5, -0.5, 0.0, // 第一个顶点的坐标 0.5, -0.5, 0.0, // 第二个顶点的坐标 0.0, 0.5, 0.0 // 第三个顶点的坐标 ]; // 创建缓冲区对象 var vertexBuffer = gl.createBuffer(); // 绑定缓冲区对象 gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer); // 将顶点数据写入缓冲区对象 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW); // 获取顶点着色器代码 var vertexShaderSource = ` attribute vec3 aPosition; void main() { gl_Position = vec4(aPosition, 1.0); } `; // 创建顶点着色器对象 var vertexShader = gl.createShader(gl.VERTEX_SHADER); // 编译顶点着色器代码 gl.shaderSource(vertexShader, vertexShaderSource); gl.compileShader(vertexShader); // 获取片元着色器代码 var fragmentShaderSource = ` void main() { gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); } `; // 创建片元着色器对象 var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); // 编译片元着色器代码 gl.shaderSource(fragmentShader, fragmentShaderSource); gl.compileShader(fragmentShader); // 创建着色器程序对象 var program = gl.createProgram(); // 将顶点着色器和片元着色器附加到着色器程序对象上 gl.attachShader(program, vertexShader); gl.attachShader(program, fragmentShader); // 链接着色器程序对象 gl.linkProgram(program); // 使用着色器程序对象 gl.useProgram(program); // 获取顶点位置属性的位置 var aPosition = gl.getAttribLocation(program, "aPosition"); // 启用顶点属性数组 gl.enableVertexAttribArray(aPosition); // 指定顶点属性数组的数据格式和位置 gl.vertexAttribPointer(aPosition, 3, gl.FLOAT, false, 0, 0); // 清空画布 gl.clearColor(0.0, 0.0, 0.0, 1.0); gl.clear(gl.COLOR_BUFFER_BIT); // 绘制三角形 gl.drawArrays(gl.TRIANGLES, 0, 3); // 刷新画面 gl.flush(); ``` 这段代码首先获取了画布元素和WebGL上下文,然后定义了三个顶点的坐标数据。接下来,创建了顶点着色器和片元着色器,并编译它们的代码。然后,创建了着色器程序对象,并将顶点着色器和片元着色器附加到着色器程序对象上。之后,启用顶点属性数组,并指定顶点属性数组的数据格式和位置。最后,清空画布,绘制三角形,并刷新画面。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值