惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

A
About on SuperTechFans
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
Tenable Blog
WordPress大学
WordPress大学
小众软件
小众软件
Y
Y Combinator Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 聂微东
大猫的无限游戏
大猫的无限游戏
T
The Exploit Database - CXSecurity.com
Attack and Defense Labs
Attack and Defense Labs
Simon Willison's Weblog
Simon Willison's Weblog
C
CXSECURITY Database RSS Feed - CXSecurity.com
量子位
有赞技术团队
有赞技术团队
C
Cisco Blogs
D
Darknet – Hacking Tools, Hacker News & Cyber Security
F
Fortinet All Blogs
S
Schneier on Security
Engineering at Meta
Engineering at Meta
Microsoft Azure Blog
Microsoft Azure Blog
Martin Fowler
Martin Fowler
Recent Announcements
Recent Announcements
Stack Overflow Blog
Stack Overflow Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
阮一峰的网络日志
阮一峰的网络日志
G
GRAHAM CLULEY
Spread Privacy
Spread Privacy
F
Full Disclosure
Scott Helme
Scott Helme
GbyAI
GbyAI
N
Netflix TechBlog - Medium
MyScale Blog
MyScale Blog
Cloudbric
Cloudbric
云风的 BLOG
云风的 BLOG
L
LangChain Blog
aimingoo的专栏
aimingoo的专栏
Hacker News - Newest:
Hacker News - Newest: "LLM"
Security Latest
Security Latest
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
MongoDB | Blog
MongoDB | Blog
The GitHub Blog
The GitHub Blog
The Register - Security
The Register - Security
L
Lohrmann on Cybersecurity
PCI Perspectives
PCI Perspectives
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
D
Docker
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
S
Secure Thoughts
C
Check Point Blog

Mengke's blog - Mengke's coding journey

年轻不是健康的免死金牌 深圳工作机会,前端 2025 年终总结 Skill 不是 MCP 的替代品:我理解的渐进式披露与选型原则 独立开发者如何开具发票 香港银行卡开户完整指南(2025年9月最新) 招商银行储蓄卡微信动账提醒恢复方法 再谈 MCP - Model Context Protocol(MCP)详解和开发教程 Get Human-Readable "Time Ago" in TypeScript 以「asset-price-mcp」为例,从 0 开发 MCP Server Model Context Protocol (MCP) 快速开始 DeepSeek + Dify 搭建本地知识库 An elegant solution for implementing optional property types using TypeScript 2024 年终总结 Quickly Create a Fullscreen WebView with Autoplay Support for Testing 以数字开头的 ID 在 querySelector 中的处理 String casing utilities in JavaScript Check if a string is a valid color Simple Event-Emitter/PubSub pattern Find which process is running on a certain port and kill it Markdown Code block's basic and advanced syntaxes Common npm commands to use locally Pnpm aliases How to safely rename a case sensitive file/directory in a git repo? A custom hooks to use an async effect A custom hooks to use local storage state 🤩 Mengke'blog 上线的这一年 🗼 五月底去了一趟日本,记录一下我的游记和攻略 网站性能优化:如何高效预加载大型静态资源 闰年之约 - 2024年2月29日 A collection of some useful websites 2023 年终总结 Android Webview <video> 标签去除默认播放按钮图 📷 纯前端也可以实现「用户无感知录屏」? Getting Spotify token to display now playing track on your website AVP - Web 端特效视频播放器 IndexedDB 基础入门 直接下载网易云音乐中歌曲MP3格式的方法 什么!一个项目给了8个字体包??? flex 布局中 start/end 和 flex-start/flex-end 的区别 深入 Pinia:从代码出发探索 Vue 状态管理的奥秘 Pinia 快速上手指南 Nest.js Typrorm 多对多关系如何创建 Strapi 快速入门 CentOS7 MySQL 数据库安装与卸载 Next.js 上手指南 Vue 数据响应式原理 deno 快速上手 - Hello World 案例 快速上手 Vue3 尝鲜 Vue 3.0 Combination API react-router-dom 路由基础教程 JavaScript 数组扁平化处理的方法总结
WebGL 学习笔记(一)基础概念与实践
Mengke · 2023-12-20 · via Mengke's blog - Mengke's coding journey

Tj holowaychuk 1EYMue_AwDw unsplash.webp

Published on
/

11 mins read

/

––– views

Share:

基础概念

我们常说 WebGL 可以用来在 Web 端做炫酷的 3D 功能,实际上 WebGL 只是一个光栅化引擎。它只是根据代码去绘制点、线、三角形。

WebGL 在 GPU 上运行。所以,需要提供可在 GPU 上运行的代码。需要提供两个函数:Vertex shader(顶点着色器)和 Fragment shader(片段着色器)。它们是以严格类型的 C/C++ 语言编写的。

  • Vertex shader:就像建筑蓝图一样,它定义了3D物体的几何形状。它接收每个顶点的位置和其他属性作为输入,然后计算它们的最终位置和一些额外的信息,最后输出这些信息。
  • Fragment shader:就像调色板一样,它决定每个像素的颜色。它接收来自 vertex shader 的信息,然后根据这些信息计算每个像素的最终颜色。

几乎所有的 WebGL 的 API 都是关于设置这一对函数的运行状态。对于要绘制的每一个松子,都要设置一系列状态值,然后通过调用 gl.drawArraysgl.drawElements 运行一个着色方法对,使着色器能在 GPU 上运行。

所有「你希望让这些函数可以有权限访问的数据」都必须提供给 GPU,有四种方法可以让着色器获取到这些数据:

  1. Attributes and Buffers (属性和缓冲区)

Buffers 是上传到 GPU 的二进制数组。通常 Buffers 包含位置(positions)、法线(normals)、纹理坐标(texture coordinates)、顶点颜色(vertex colors)等信息,当然你也可以自由的放任何数据到 Buffers 中。

Attributes 用来指定如何从 Buffers 获取数据并加入到你的片段着色器中(vertex shader)。例如可以将位置放入缓冲区中,每个位置三个 32 位浮点数。你需要告诉特定属性从哪个缓冲区中提取位置、应该提取什么类型的数据(三个 32 位浮点数)、位置在缓冲区中的偏移量以及从其中获取多少字节到下一个位置。

Buffers 是不能随机访问的。相反,顶点着色器被执行指定的次数。每次执行时,都会从每个指定的缓冲区中提取下一个值并将其分配给属性。

  1. Uniforms(全局变量)

Uniforms 实际上是在执行着色器程序之前设置的全局变量。

  1. Textures(纹理)

纹理是一个数据序列,可以在着色程序运行中随意读取其中的数据。 大多数情况存放的是图像数据,但是纹理仅仅是数据序列, 你也可以随意存放除了颜色数据以外的其它数据。

  1. Varyings(变量)

可变量是一种顶点着色器给片段着色器传值的方式,依照渲染的图元是点, 线还是三角形,顶点着色器中设置的可变量会在片段着色器运行中获取不同的插值。

Hello World

效果