网站首页 > 技术文章 正文
大家好,我是前端西瓜哥,上一章我们用 attribute 变量,从外部设置顶点着色器中点的位置信息。
这次我们把目光投向片元着色器,通过片元着色器修改点的颜色。
片元着色器
片元着色器的代码改一下:
const fragmentShaderSrc = `
precision mediump float;
uniform vec4 u_FragColor;
void main() {
gl_FragColor = u_FragColor;
}
`;
类似顶点着色器的 attribute,我们在这里声明了一个 uniform 变量 u_FragColor,同样我们使用过的是 vec4 类型,4 个浮点数组成的结构体。
片元着色器中不能设置 attribute 类型的变量,只能用 uniform,或者也能用 varing 变量,支持从顶点着色器传递数据到片元着色器,这个以后西瓜哥会专门讲解。
我们会将这个变量赋值给 WebGL 片元着色器的内置属性 gl_FragColor,确定图形的颜色。
此外,因为使用了变量,所以顶部要加一个 precision highp float; 的玩意。
这是设置 片元着色器的 float 精度为高精度。因为现在桌面端浏览器性能都很好,我们直接设置高精度即可。此外还有 mediump 中等精度,和 lowp 低精度,适合用在一些性能羸弱的设备上。精度越低,渲染的效果越差。
然后就是给我们声明的 u_FragColor 传值了,在 JavaScript 里。
修改颜色
/** 修改片元着色器的 uniform **/
const u_FragColor = gl.getUniformLocation(gl.program, "u_FragColor");
gl.uniform4f(u_FragColor, 1, 1, 0, 1); // 绿色
西瓜哥这里通过 gl.getUniformLocation 方法获取对应程序对象中片元着色器的名为 u_FragColor 的 uniform 变量的地址。
然后通过 gl.uniform4f 给这个 uniform 类型赋值。
WebGL 中的颜色分量取值范围是 0 到 1,对应的是一个 比值,比如 vec4(1.0, 0.5, 0, 0.5),其实就等价于 rbga(255, 255*0.5, 0, 0.5) 。
渲染结果:
代码实现:
/**
* wegbl 绘制一个点
*/
/** @type {HTMLCanvasElement} */
const canvas = document.querySelector("canvas");
const gl = canvas.getContext("webgl");
const vertexShaderSrc = `
attribute vec4 a_Position;
void main() {
gl_Position = a_Position;
gl_PointSize = 30.0;
}
`;
const fragmentShaderSrc = `
precision highp float;
uniform vec4 u_FragColor;
void main() {
gl_FragColor = u_FragColor;
}
`;
/**** 渲染器生成处理 ****/
// 创建顶点渲染器
const vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, vertexShaderSrc);
gl.compileShader(vertexShader);
// 创建片元渲染器
const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, fragmentShaderSrc);
gl.compileShader(fragmentShader);
// 程序对象
const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
gl.useProgram(program);
gl.program = program;
/** 修改顶点着色器的 attribute */
const a_Position = gl.getAttribLocation(gl.program, "a_Position");
gl.vertexAttrib3f(a_Position, 0, 0, 0);
/** 【本章新增的代码】修改片元着色器的 uniform **/
const u_FragColor = gl.getUniformLocation(gl.program, "u_FragColor");
gl.uniform4f(u_FragColor, 0, 1, 0, 1);
/** 画布绘制 **/
// 清空画布,并指定颜色
gl.clearColor(0, 0, 0, 1);
gl.clear(gl.COLOR_BUFFER_BIT);
// 绘制点
gl.drawArrays(gl.POINTS, 0, 1);
Demo 地址:
https://codesandbox.io/s/xp81lh?file=/index.js
这个 demo 加了点料,写了个定时器不断修改颜色的函数,将底部的 // changeColor(); 的注释取消掉即可看到颜色变化的效果。
结尾
我是前端西瓜哥,欢迎关注我,学习更多 WebGL 知识。
下一节我们就真正来绘制三角形了。复杂的三维物体,都可以通过一个个很小的三角形组成,三角形越多,三维物体就越精细。
猜你喜欢
- 2025-07-02 筛选了100个配色工具后,我挑出了这25个
- 2025-07-02 好程序员:前端JavaScript全解析——Canvas绘制形状(上)
- 2025-07-02 用 Cursor 开发 10 +项目后,汇总了40 多条提示词
- 2025-07-02 Piny:代码编辑界的“视觉革命”,让前端开发从此“看得见”!
- 2025-07-02 印刷色彩特性曲线是什么?有什么用?怎么获取?
- 2025-07-02 前端最常用的25个正则表达式,代码效率提高 80%
- 2025-07-02 让 浏览器智能选择颜色?CSS 这个新功能太聪明了!
- 2024-10-08 HTML常用全部代码,你懂,你不想成功都难
- 2024-10-08 纯CSS文字聚光灯效果~#web前端 聚光灯wps
- 2024-10-08 css基础必备-元素背景,前端小白一看就会
你 发表评论:
欢迎- 07-08记oracle日志挖掘实操&查询归档不正常增长情况(一)
- 07-08Oracle 伪列!这些隐藏用法你都知道吗?
- 07-08orcl数据库查询重复数据及删除重复数据方法
- 07-08重大故障!业务核心表被truncate删除,准备跑路……
- 07-08oracle数据恢复—oracle执行truncate命令误删除数据的数据恢复
- 07-08Oracle-rac 修改scanip(oracle 修改sequence cache)
- 07-08ORACLE RAC CDB和PDB切换(oracle数据库rac切换)
- 07-08Oracle rac haip作用(oracle rac的典型特征)
- 596℃几个Oracle空值处理函数 oracle处理null值的函数
- 588℃Oracle分析函数之Lag和Lead()使用
- 576℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 573℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 569℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 562℃【数据统计分析】详解Oracle分组函数之CUBE
- 549℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 542℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
-
- 记oracle日志挖掘实操&查询归档不正常增长情况(一)
- Oracle 伪列!这些隐藏用法你都知道吗?
- orcl数据库查询重复数据及删除重复数据方法
- 重大故障!业务核心表被truncate删除,准备跑路……
- oracle数据恢复—oracle执行truncate命令误删除数据的数据恢复
- Oracle-rac 修改scanip(oracle 修改sequence cache)
- ORACLE RAC CDB和PDB切换(oracle数据库rac切换)
- Oracle rac haip作用(oracle rac的典型特征)
- 新手小白怎么学UI设计 推荐学习路线是什么
- 超实用!0基础UI设计自学指南(0基础学ui设计好就业吗)
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端懒加载 (49)
- 前端获取当前时间 (50)
- 前端接口 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle的函数 (57)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)