WebGL系列教程三(使用缓冲区绘制三角形)

embedded/2024/10/21 11:51:27/

目录

  • 1 前言
  • 2 缓冲区介绍
  • 3 声明顶点的位置和颜色
  • 4 回忆Shader的初始化
  • 5 开始缓冲区的逻辑
    • 5.1 声明顶点坐标
    • 5.2 创建并绑定缓冲区
    • 5.3 获取顶点着色器中的变量
    • 5.4 使变量从缓冲区取值
    • 5.5 绘制
    • 5.6 完整代码
  • 7 总结

1 前言

  上一篇中我们介绍了WebGL的环境搭建及Shader的初始化,并绘制了一个点,这一篇我们来绘制一个三角形,并介绍缓冲区的使用方法。

2 缓冲区介绍

  缓冲区就是一块存储数据的区域,为了方便我们一次性把所需的数据都传给WebGL,而不是每次都去传。这次我们的流程和上一篇的操作流程基本是一致的,唯一不同的在于绘制时使用缓冲区的数据绘制三角形,我们还是将整个流程梳理一下:

  1. 创建着色器对象
  2. 获取着色器对象的源代码
  3. 绑定着色器的源
  4. 编译着色器
  5. 创建并关联项目
  6. 创建并绑定缓冲区
  7. 读取缓冲区数据并绘制三角形

  最后就我们要的三角形是这样的,颜色是红色:
在这里插入图片描述

3 声明顶点的位置和颜色

  这一块的代码并没有什么特别之处,只是去掉了声明点的那一句代码gl_PointSize = 10.0;,因为这次我们不再需要绘制点了,其他的保持原样。

 <script id="vertex-shader" type="x-shader/x-vertex">//声明一个点,vec2表示2维向量attribute vec2 aPos;void main(){//点的位置,将vec2补齐为vec4gl_Position = vec4(aPos,0.0,1.0);}</script><script id="fragment-shader" type="x-shader/x-fragment">precision highp float;void main(){//点的颜色,rgba形式,红色gl_FragColor = vec4(1.0,0.0,0.0,1.0);}</script>

4 回忆Shader的初始化

  这一块的代码我们在上一篇已经介绍过了,这里不再细说,全部一次性给出,由于我们之后的每一篇博文都有这个操作,因此,这块的代码可以封装为一个函数重复调用,之后的博文也将不再列出。

 const canvas = document.getElementById("canvas");const gl = canvas.getContext("webgl");//创建着色器对象let vertexShader = gl.createShader(gl.VERTEX_SHADER);let fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);//获取着色器对象的源let vertexSource = document.getElementById("vertex-shader").innerText;let fragmentSource = document.getElementById("fragment-shader").innerText;//绑定着色器的源gl.shaderSource(vertexShader,vertexSource);gl.shaderSource(fragmentShader,fragmentSource);//编译着色器gl.compileShader(vertexShader);gl.compileShader(fragmentShader);console.log(gl.getShaderInfoLog(vertexShader));//创建并关联项目let program = gl.createProgram();gl.attachShader(program,vertexShader);gl.attachShader(program,fragmentShader);gl.linkProgram(program);gl.useProgram(program);

5 开始缓冲区的逻辑

5.1 声明顶点坐标

const vertices = new Float32Array([-0.5,0.0,0.0,1.0,0.5,0.0,
]);

5.2 创建并绑定缓冲区

gl.bindBuffer(gl.ARRAY_BUFFER,buffer);
gl.bufferData(gl.ARRAY_BUFFER,vertices,gl.STATIC_DRAW);

5.3 获取顶点着色器中的变量

let aPos = gl.getAttribLocation(program,"aPos");

5.4 使变量从缓冲区取值

//指定aPos如何读取缓冲区  两个值表示一个坐标,float类型,不使用归一化,2个值所占的字节长度,从偏移0倍字节开始读取
gl.vertexAttribPointer(aPos,2,gl.FLOAT,false,2*Float32Array.BYTES_PER_ELEMENT,0);
//允许aPos变量从缓冲区取值
gl.enableVertexAttribArray(aPos);

什么是归一化?
  举个例子,假设我们的数据范围是从0-10,变为0-1的过程,就叫归一化。那怎么变为0-1呢?很简单,将每个值都除以10就可以了。这里我们不使用归一化,意味着不允许WebGL修改我们的数据。

5.5 绘制

//绘制三角形,从零好索引开始,绘制三个点
gl.drawArrays(gl.TRIANGLES,0,3);

大功告成,看一下效果:
在这里插入图片描述

5.6 完整代码

//声明顶点坐标
const vertices = new Float32Array([-0.5,0.0,0.0,1.0,0.5,0.0,
]);
const buffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER,buffer);
gl.bufferData(gl.ARRAY_BUFFER,vertices,gl.STATIC_DRAW);
let aPos = gl.getAttribLocation(program,"aPos");
//绑定坐标
//指定aPos如何读取缓冲区  两个值表示一个坐标,float类型,不使用归一化,2个值所占的字节长度,从偏移0倍字节开始读取
gl.vertexAttribPointer(aPos,2,gl.FLOAT,false,2*Float32Array.BYTES_PER_ELEMENT,0);
gl.enableVertexAttribArray(aPos);
//绘制三角形,从零开始,绘制三个点
gl.drawArrays(gl.TRIANGLES,0,3);

7 总结

  本篇中,我们首先回忆了Shader的初始化过程,然后介绍了如何使用缓冲区进行三角形绘制,并详细介绍了如何从缓冲区进行取值,及各个参数的含义,下一篇我们讲如何将三角形变为彩色的,回见~


http://www.ppmy.cn/embedded/109149.html

相关文章

Java 面试题:Java的垃圾收集算法 --xunznux

文章目录 标记算法可达性分析算法标记算法的基本流程&#xff1a;标记算法的特点&#xff1a;标记算法的局限性&#xff1a;标记算法的优化&#xff1a;结论&#xff1a; 1. 标记-清除算法&#xff08;Mark-Sweep&#xff09;基本原理&#xff1a;优点&#xff1a;缺点&#xf…

Java中的static关键字

static代码块只会在类中加载执行一次~ 测试代码 public class TestStatic {{System.out.println("匿名代码块");}// static只加载一次static{System.out.println("静态代码块");}public TestStatic(){System.out.println("构造方法");}public …

2024/9/8 c++ smart

1.通过自己编写的class来实现unique_ptr指针的功能 #include <iostream> using namespace std; template<class T> class unique_ptr { public: //无参构造函数 unique_ptr(); //有参构造函数 unique_ptr(T* ptr nullptr):ptr(p…

Android Launcher3

一、定义与功能 Android Launcher是Android操作系统中的一个重要组件&#xff0c;它负责管理和呈现用户界面&#xff0c;包括桌面、应用程序抽屉和部件。Launcher不仅为用户提供了一个启动应用程序的入口&#xff0c;还允许用户自定义手机的主屏幕、图标、小部件布局以及一些基…

探索 Linux:开源操作系统的璀璨世界

摘要&#xff1a;本文围绕 Linux 展开深入探讨。从历史来看&#xff0c;20 世纪 90 年代初 Linus Torvalds 发布 Linux 内核源代码开启新纪元&#xff0c;开源模式使内核不断成长。Linux 的核心概念包含内核、文件系统、进程和线程等&#xff0c;其中内核管理硬件资源与提供系统…

【高校主办,EI稳定检索】2024年人机交互与虚拟现实国际会议(HCIVR 2024)

会议简介 2024年人机交互与虚拟现实国际会议&#xff08;HCIVR 2024&#xff09;定于2024年11月15-17日在中国杭州召开&#xff0c;会议由浙江工业大学主办。人机交互&#xff0c;虚拟现实技术的发展趋势主要体现在系统将越来越实际化&#xff0c;也越来越贴近人类的感知和需求…

计算机网络 第二章: 物理层_信道的极限容量 奈氏准则 香农公式 (带习题)

文章目录 1. 造成信号失真的主要因素2. 奈氏准则3. 香农公式习题解答 1. 造成信号失真的主要因素 信道上传输的数字信号&#xff0c;可以看做是多个频率的模拟信号进行多次叠加后形成的方波。 如果数字信号中的高频分量在传输时受到衰减甚至不能通过信道&#xff0c;则接收端接…

LDRA Testbed(TBrun)软件单元测试_实例讲解(对多次调用的函数打桩)

系列文章目录 LDRA Testbed软件静态分析_操作指南 LDRA Testbed软件静态分析_自动提取静态分析数据生成文档 LDRA Testbed软件静态分析_Jenkins持续集成(自动静态分析并用邮件自动发送分析结果) LDRA Testbed软件静态分析_软件质量度量 LDRA Testbed软件静态分析_常见问题及…