WebGl 多缓冲区和数据偏移

news/2024/10/25 3:53:07/

1.多缓冲区

  • 多缓冲区技术通常涉及到创建多个缓冲区对象,并将它们用于不同的数据集。
  • 这种做法可以提高数据处理效率,尤其是在处理大量数据或需要频繁更新数据时。
  • 通过预先分配和配置多个缓冲区,可以在不影响渲染性能的情况下,快速切换数据集。

2.数据偏移

  • 数据偏移是指在处理缓冲区数据时,指针跳过一定数量的字节来定位特定的数据。
  • 在WebGL中,gl.vertexAttribPointer函数的offset参数用于指定从缓冲区起始位置开始的偏移量。
  • 这允许开发者将不同类型的数据(如顶点位置、法线、颜色等)存储在同一个缓冲区中,并通过偏移量来正确地访问这些数据。

3. 实现示例

3.1. 声明aPointSize
javascript"> attribute float aPointSize;
3.2. 获取attribute变量aPointSize
javascript">const aPointSize = gl.getAttribLocation(program, 'aPointSize');
3.3. 获取字节数
javascript"> const BYTES = points.BYTES_PER_ELEMENT;
3.4. 顶点大小参数设置:
javascript">gl.vertexAttribPointer(aPointSize, 1, gl.FLOAT, false, BYTES * 3, BYTES * 2);

4. 代码实现

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><style>* {margin: 0;padding: 0;}canvas {margin: 50px auto;display: block;background: pink;}</style><title>修改点的颜色</title>
</head><body><canvas id="canvas" width="400" height="400">此浏览器不支持canvas</canvas><script src="./js/index.js"></script><script>const ctx = document.getElementById('canvas')const gl = ctx.getContext('webgl')// 顶点着色器源码// 1. 声明aPointSizeconst vertexShaderSource = `attribute vec4 aPosition;attribute float aPointSize;void main() {gl_Position = aPosition; gl_PointSize = aPointSize;}`// 片源着色器源码const fragmentShaderSource = `void main() {gl_FragColor = vec4(0.0,0.0,0.0,1.0); // r, g, b, a}`const program = initShader(gl, vertexShaderSource, fragmentShaderSource);const aPosition = gl.getAttribLocation(program, 'aPosition');// 1.获取attribute变量aPointSizeconst aPointSize = gl.getAttribLocation(program, 'aPointSize');// 2.创建顶点数据,前两位是顶点的位置,第三位是顶点的大小const points = new Float32Array([-0.5, -0.5, 10.0,0.5, -0.5, 20.0,0.0, 0.5, 30.0,])const buffer = gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER, buffer);gl.bufferData(gl.ARRAY_BUFFER, points, gl.STATIC_DRAW);// 3.获取字节数const BYTES = points.BYTES_PER_ELEMENT;// 4.顶点位置参数设置:两个相邻顶点之间的字节数为三个字节,所以字节数为BYTES*3; 顶点数据是前两位,所以偏移量为0;gl.vertexAttribPointer(aPosition, 2, gl.FLOAT, false, BYTES * 3, 0);// 5.顶点大小参数设置:两个相邻顶点之间的字节数为三个字节,所以字节数为BYTES*3; 顶点数据是第三位,所以偏移量为BYTES*2;gl.vertexAttribPointer(aPointSize, 1, gl.FLOAT, false, BYTES * 3, BYTES * 2);// 4.激活变量gl.enableVertexAttribArray(aPosition);gl.enableVertexAttribArray(aPointSize);gl.drawArrays(gl.POINTS, 0, 3);// 着色器 function initShader(gl, vertexShaderSource, fragmentShaderSource) {const vertexShader = gl.createShader(gl.VERTEX_SHADER);const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);gl.shaderSource(vertexShader, vertexShaderSource);gl.shaderSource(fragmentShader, fragmentShaderSource);gl.compileShader(vertexShader);gl.compileShader(fragmentShader);const program = gl.createProgram();gl.attachShader(program, vertexShader);gl.attachShader(program, fragmentShader);gl.linkProgram(program);gl.useProgram(program);return program;}</script>
</body></html>

5. 效果如下 


http://www.ppmy.cn/news/1541736.html

相关文章

【C++指南】运算符重载详解

引言 C 提供了运算符重载这一特性&#xff0c;允许程序员为自定义类型&#xff08;如类和结构体&#xff09;定义运算符的行为。 通过运算符重载&#xff0c;可以使自定义类型对象像内置类型一样使用运算符&#xff0c;从而提高代码的可读性和易用性。 本文将详细介绍 C 中运算…

光通信——前传基本架构

一、前传基本架构 第三代移动通信技术引入了分布式射频接入网络&#xff08;Distributed Radio Access Network &#xff0c; D-RAN&#xff09;架构。在此架构中的的基带处理单元&#xff08; Baseband Unit &#xff0c; BBU&#xff09; 和 射频拉远单元&#xff08; Remot…

王源携手匡威,官宣全球代言人身份,引全网热议

近日&#xff0c;匡威隆重宣布&#xff0c;青年偶像王源荣膺其全球品牌代言人。在官宣消息发布前夕&#xff0c;王源与匡威的合作便已在微博热搜上占据头榜&#xff0c;备受广大网友关注。 随着官宣及产品上线的钟声敲响&#xff0c;王源的粉丝们迅速行动起来&#xff0c;积极支…

【Linux】从 fork() 到 exec():理解 Linux 进程程序替换的魔法

1.前言 进程程序替换是指一个进程用另一个新的可执行程序来替换当前正在执行的程序&#xff0c;这个过程通过通过exec系列函数完成。在Linux或UNIX系统中&#xff0c;进程程序替换通常发生在一个进程通过fork()创建了子进程之后&#xff0c;子进程用exec()函数加载和执行另一个…

数据库表开发 vs 面向接口开发

时间&#xff1a;2024年 10月 24日 作者&#xff1a;小蒋聊技术 邮箱&#xff1a;wei_wei10163.com 微信&#xff1a;wei_wei10 音频地址&#xff1a;喜马拉雅 大家好&#xff0c;欢迎来到“小蒋聊技术”&#xff0c;我是小蒋&#xff01;今天我们来聊聊数据库表开发 vs 面…

SpringBoot基于若依项目工时统计成本核算管理源码带教程

是前后端分离的架构&#xff0c;前端使用Vue2&#xff0c;后端使用SpringBoot2。 技术框架&#xff1a;SpringBoot2.0.0 Mybatis1.3.2 Shiro swagger-ui jpa lombok Vue2 Mysql5.7 运行环境&#xff1a;jdk8 IntelliJ IDEA maven 宝塔面板 系统与功能介绍 这是一…

003 Qt_信号和槽-上

文章目录 前言信号与槽的概念信号的本质槽的本质信号与槽的连接自定义槽函数 小结 前言 本文将会向你介绍信号与槽的概念&#xff0c;以及如何自定义槽函数 信号与槽的概念 1、在 Qt 中&#xff0c;用户和控件的每次交互过程称为⼀个事件。 比如 “用户点击按钮” 是⼀个事件…

软件设计师备忘录

第1章 计算机系统知识 运算器&#xff1a;P2 算术逻辑单元(ALU)。U是运算器的重要组成部件&#xff0c;负责处理数据&#xff0c;实现对数据的算术运算和逻辑运算。 累加寄存器(AC)。算的结果是放在累加器中的&#xff0c;运算器中至少要有一个累加寄存器。 数据缓冲寄存器(DR…