当前位置: 首页 > news >正文

webgl 顶点、片元着色器传参,绘制彩色三角形

一:顶点着色器编码

顶点着色器需要接收的参数使用 attribute 关键字声明。a_Position 点的位置。a_Color 颜色

varying 关键字声明变量,需要传递给片元着色器的变量。

// 顶点着色器
const VSHADER_SOURCE = `
attribute vec4 a_Position;
attribute vec4 a_Color;
varying vec4 v_Color;void main() {v_Color = a_Color;gl_Position = a_Position;}
`;

二:片元着色器编码

片元着色器使用 varying 关键字声明从顶点着色器获取的变量 v_Color

// 片元着色器
const FSHADER_SOURCE = `precision mediump float;varying vec4 v_Color;void main() {gl_FragColor = v_Color;}
`;

三:交错组织顶点-颜色数组

为了优化程序,使用一个数组组织点位和颜色两个参数,这样只需要创建一个缓冲区即可。

每 5 个数字代表一个顶点,前 2 个代表顶点的位置,后 3 个代表顶点的颜色。 

 // 创建顶点const vertices = new Float32Array([0.0, 0.5, 1.0,0.0,0.0,   // 顶点1的坐标-0.5, -0.5, 0.0,1.0,0.0, // 顶点2的坐标0.5, -0.5, 0.0,0.0,1.0,  // 顶点4的坐标])

四:使用缓冲区向顶点着色器传参

回顾一下使用缓冲区为顶点着色器传递参数的步骤

1,创建缓冲区对象

 // 创建缓冲区对象const vertexBuffer = gl.createBuffer();

2,将缓冲区对象绑定到 target 对象上

  gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);

3,将顶点坐标数据写入缓冲区对象

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

4,将缓冲区对象分配给对应的 attribute 变量

 const FSIZE = vertices.BYTES_PER_ELEMENT;const a_Position = gl.getAttribLocation(gl.program, 'a_Position');// 将缓冲区对象分配给 a_Position 变量gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, FSIZE*5, 0);const a_Color = gl.getAttribLocation(gl.program, 'a_Color');// 将缓冲区对象分配给 a_Position 变量gl.vertexAttribPointer(a_Color, 3, gl.FLOAT, false, FSIZE*5, FSIZE*2);

5,开启 attribute 变量

  gl.enableVertexAttribArray(a_Position);gl.enableVertexAttribArray(a_Color);

五:gl.vertexAttribPointer() 的步进与偏移量

gl.vertexAttribPointer()

第四个参数: 相邻两个顶点之间的字节数,

最后一个参数:指定相邻两个顶点间的字节数,即 attribute 变量从指定缓冲区中的何处开始存储,如果是从起始位置开始,该参数应设为0。

第四步时将 vertices 数组中每个元素的大小(字节数)存储到 FISIZE 中。

所以4.4 中 gl.vertexAttribPointer() 第四个参数都是 FSIZE * 5,

由于前两个数字代表顶点,所以顶点参数是从 0 开始,则将缓冲区对象分配给 a_Position 变量时

最后一个参数是0

gl.vertexAttribPointer( a_Position, 2, gl.FLOAT, false, FSIZE*5, 0)

后三个数代表颜色,是从第三个数开始的,所以要偏移两个数字。最后一个参数是 FSIZE * 2

gl.vertexAttribPointer( a_Color,  3,  gl.FLOAT,  false,  FSIZE * 5,  FSIZE * 2)

http://www.dtcms.com/a/568446.html

相关文章:

  • 实验室安全教育与管理平台学习记录(八)特种设备安全
  • 浙江网站制作国外翻墙设计网站
  • 《神经网络与深度学习》学习笔记一
  • 超越蓝牙与Wi-Fi,UWB技术如何解锁手机下一波创新浪潮?
  • 【VPX650G】基于 VPX 系统架构的 JFM9VU13P FPGA+JFMQL100TAI 超宽带信号处理平台
  • 软考 系统架构设计师系列知识点之杂项集萃(190)
  • Linux信号(下):信号保存和信号处理
  • 仅需一部智能手机,在NVIDIA Isaac Sim中重建真实场景:终极实战指南
  • Spring设计模式刨根问底
  • 河南郑州做网站汉狮网站赚钱的方式
  • 不是万维网的网站如何注册公司抖音号
  • AI 赋能科研实践:从选题到发表的技术重构之路
  • 技术的秩序:IT资产与配置管理的现代重构
  • 告别布线噩梦:8公里LoRa边缘网关如何重构工业物联边界
  • Python 图像处理利器:Pillow 深度详解与实战应用
  • 【数据结构】:二叉树——顺序结构,链式结构的实现及相关操作
  • RS485转以太网串口服务器-串口设备联网的理想选择
  • 电动化筑基:智能社会的能源革命与产业重构
  • 【深度学习新浪潮】智能体在图像处理领域的技术突破与实践指南
  • 这是我做的网站吗汇云网站建设
  • 【JAVA 进阶】穿越之我在修仙世界学习 @Async 注解(深度解析)
  • [图像处理]图像美化
  • windows10下用wsl2部署Ollama同时用docker部署nginx开放外网访问
  • Linux学习笔记(十一)--文件接口与重定向
  • Linux 自定义协议实现网络计算器
  • 【IC】NoC设计入门 --交换矩阵
  • 【NCCL】Merged Device(合并设备)和bond的区别
  • 网站后台栏目管理dede做双语网站
  • 怎么做淘客网站开网站供免费下载
  • 下载CUDA Toolkit和VS后,配置vscode