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

WebGL 3着色器和GLSL

我们之前提到过着色器和GLSL,但是没有涉及细节,你可能已经对此有所了解, 但以防万一,这里将详细讲解着色器和GLSL。

在工作原理中我们提到,WebGL每次绘制需要两个着色器, 一个顶点着色器和一个片段着色器,每一个着色器都是一个方法

一个顶点着色器和一个片段着色器链接在一起放入一个着色程序中(或者只叫程序)。

一个典型的WebGL应用会有多个着色程序。


顶点着色器

一个顶点着色器的工作是生成裁剪空间坐标值,通常是以下的形式

void main() {gl_Position = doMathToMakeClipspaceCoordinates
}

每个顶点调用一次(顶点)着色器,每次调用都需要设置一个特殊的全局变量gl_Position, 该变量的值就是裁剪空间坐标值。

顶点着色器需要的数据,可以通过以下三种方式获得。

  1. Attributes 属性 (从缓冲中获取的数据)
  2. Uniforms 全局变量 (在一次绘制中对所有顶点保持一致值)
  3. Textures 纹理 (从像素或纹理元素中获取的数据)

Attributes 属性

最常用的方法是缓冲和属性,在工作原理 中讲到了缓冲和属性,你可以创建缓冲

var buf = gl.createBuffer();

将数据存入缓冲

gl.bindBuffer(gl.ARRAY_BUFFER, buf);
gl.bufferData(gl.ARRAY_BUFFER, someData, gl.STATIC_DRAW);

然后初始化的时候,在你制作的(着色)程序中找到属性所在地址

var positionLoc = gl.getAttribLocation(someShaderProgram, "a_position");

在渲染的时候告诉WebGL怎么从缓冲中获取数据传递给属性

// 开启从缓冲中获取数据
gl.enableVertexAttribArray(positionLoc);var numComponents = 3;  // (x, y, z)
var type = gl.FLOAT;    // 32位浮点数据
var normalize = false;  // 不标准化
var offset = 0;         // 从缓冲起始位置开始获取
var stride = 0;         // 到下一个数据跳多少位内存// 0 = 使用当前的单位个数和单位长度 ( 3 * Float32Array.BYTES_PER_ELEMENT )gl.vertexAttribPointer(positionLoc, numComponents, type, false, stride, offset);

参考: 

WebGL 着色器和GLSL

18.WebGL渲染和执行流程 | 前端技术积累

http://www.xdnf.cn/news/6414.html

相关文章:

  • Elasticsearch性能调优全攻略:从日志分析到集群优化
  • C++多态实现的必要条件剖析
  • 架构进阶:企业流程框架设计思路【附全文阅读】
  • 微信小程序van-dialog确认验证失败时阻止对话框的关闭
  • Spring 模拟转账开发实战
  • 什么是红海战略?了解红海战略的竞争目标
  • (面试)Handler消息处理机制原理
  • 基于Deeplearning4j的多源数据融合预测模型实现:从设计到落地全解析
  • 【frp XTCP 穿透配置教程
  • 关于AI人工智能的知识图谱简介
  • 2025认证杯数学建模第二阶段A题小行星轨迹预测思路+模型+代码
  • Framebuffer显示bmp图片
  • 【实证分析】MDA文本相似度分析(2008-2023年)
  • 基于redis实现分布式锁方案实战
  • Linux:理解文件系统
  • 网络损伤仪功能介绍与应用场景剖析
  • Java详解LeetCode 热题 100(17):LeetCode 41. 缺失的第一个正数(First Missing Positive)详解
  • JavaScript的BOM、DOM编程
  • Java并发编程:CAS操作
  • java调用get请求和post请求
  • 无人机屏蔽与滤波技术模块运行方式概述!
  • Git命令总结
  • 视频质量分析时,遇到不同分辨率的对照视频和源视频,分辨率对齐的正确顺序。
  • Linux515 rsync定时备份
  • 使用LoRA微调Qwen2.5-VL-7B-Instruct完成电气主接线图识别
  • Android 图片自动拉伸不变形,点九
  • Linux 系统中的文件系统层次结构和重要目录的用途。
  • 隆重推荐(Android 和 iOS)UI 自动化工具—Maestro
  • 浏览器宝塔访问不了给的面板地址
  • CSS图片垂直居中问题解决方案