首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
01 | 初步介绍微信小程序
02 | 还有哪些其它公司的小程序产品
03 | 小程序的特点及开发能力
04 | 新的一年,微信小程序开放了哪些新功能?
05 | 小程序运行机制简介:从零构建一个Web App需要做哪些事情?
06 | 开发环境配置:创建你的第一个小程序项目
07 | icon组件:关于图标的4个实现方案
08 | progress组件:如何自定义实现一个环形进度条?
09 | rich-text组件:如何单击预览rich-text中的图片并保存?
10 | view容器组件及Flex布局(一):学习容器组件view及其重要属性
11 | view容器组件及Flex布局(二):介绍flex布局中常用的样式及样式值
12 | 可移动容器及可移动区域(一):学习使用movable-view与movable-area组件
13 | 可移动容器及可移动区域(二):如何实现侧滑删除功能
14 | scroll-view介绍:在小程序中如何实现滚动锚定?
15 | scroll-view介绍:如果渲染一个滚动的长列表?
16 | 滚动选择器(一):学习使用选择器组件
17 | 滚动选择器(二):使用两种方式自定义实现省、市、区三级联动的选择器
18 | 滑动选择器表单组件:如何基于wxs自定义一个竖向的slider?
19 | 页面链接组件:如何自定义一个导航栏?
20 | image媒体组件(上):如何实现图片的懒加载?
21 | image媒体组件(下):开发中经常遇到的问题?
22 | 如何实现直播间功能?(一):了解live-pusher、live-player组件的主要属性及使用限制
23 | 如何实现直播间功能?(二):如何开启、使用腾讯云的云直播功能
24 | 如何实现直播间功能?(三):安装与使用ffmepg,及使用ffmpeg进行推拉流验证
25 | 如何实现直播间功能?(四):使用live-pusher、live-player组件在小程序中实现直播功能
26 | 如何实现直播间功能?(五):同层渲染
27 | 如何实现直播间功能?(六):live-pusher、live-player组件在开发中的常见问题
28 | web-view(一):了解session、cookie等相关基本概念
29 | web-view(二):了解常见的四种鉴权方式
30 | web-view(三):如何使用koa框架,及如何进行热加载?
31 | web-view(四):如何在服务器端实现cookie与sesson的生成?
32 | web-view(五):如何将session存储到服务器端,及如何实现token验证?
33 | web-view(六):基于koa中间件,实现微信一键登录的后端接口
34 | web-view(七):实现微信用户一键登录
35 | web-view(八):了解正确的微信登录姿势
36 | web-view(九):web-view组件在开发的常见问题讲解
37 | WebGL介绍(一):了解WebGL相关的基础概念
38 | WebGL介绍(二):如何在小程序中取到WebGL上下文环境对象
39 | WebGL介绍(三):了解WebGL的世界坐标系
40 | WebGL介绍(四):重新认识右手坐标系及如何编写顶点着色器代码
41 | WebGL介绍(五):学习片断着色器编写,了解变量修饰变型uniform与attribute
42 | WebGL介绍(六):了解在WebGL中裁剪空间是如何裁剪出来的
43 | WebGL介绍(七):了解着色器变量值的绑定及三种三角形绘制模式之间的差异
44 | WebGL介绍(八):在着色器中使用共享变量,绘制一个颜色渐变的正方形
45 | WebGL介绍(九):完成动画
46 | WebGL介绍(十):绘制一个旋转的立方体
47 | WebGL介绍(十一):在3D绘制中使用纹理材质
48 | WebGL介绍(十二):如何创建相机、场景及光源
49 | WebGL介绍(十三):创建加载器、渲染器与控制器,完成3D模型文件的加载与展示
50 | 网络接口简介(一):如何使用wx.request接口
51 | 网络接口简介(二):将登录代码模块化封装
52 | 网络接口简介(三):Promise介绍及 6 个常用方法
53 | 网络接口简介(四):Promise三个方法any、all与race的使用介绍
54 | 网络接口简介(五):基于Promise+await、async关键字改写登录模块
55 | 网络接口简介(六):关于Page页面隐藏代码执行及Promise对象的catch处理的补充
56 | 网络接口简介(七):学习EventChannel对象
57 | 网络接口简介(八):观察者模式介绍及Event模块实现
58 | 网络接口简介(九):扩展wxp模块的request3方法,实现用户登录的自动融合
59 | tabBar组件(一):系统默认的tabBar组件如何开启及使用
60 | tabBar组件(二):基于系统提供的自定义方式,实现一个tabBar组件
61 | tabBar组件(三):通过自定义组件扩展的方式,给任意组件添加通用方法
62 | 开放接口(一):如何对Page进行全局扩展
63 | 开放接口(二):优化前后端登录代码,解决后端解密错误
当前位置:
首页>>
技术小册>>
微信小程序全栈开发实战(上)
小册名称:微信小程序全栈开发实战(上)
### 44 | WebGL介绍(八):在着色器中使用共享变量,绘制一个颜色渐变的正方形 在WebGL的广阔世界中,着色器(Shader)扮演着至关重要的角色,它们直接控制着图形硬件上的渲染过程,使得开发者能够创造出令人惊叹的视觉效果。本章节将深入探讨如何在WebGL的着色器中使用共享变量(尽管在WebGL的上下文中,我们通常谈论的是uniform、attribute和varying变量,但这里“共享变量”的概念可以理解为在多个顶点或片段间共享的数据处理方式,特别是通过巧妙利用varying变量或特定算法实现的效果),并通过一个实例——绘制一个颜色渐变的正方形,来展示这一技术的实际应用。 #### 一、着色器基础回顾 在深入讨论之前,我们先简要回顾一下WebGL中的着色器类型及其基本作用: - **顶点着色器(Vertex Shader)**:负责处理每个顶点的数据,如位置、颜色、纹理坐标等,并输出处理后的顶点信息给图形管线。 - **片段着色器(Fragment Shader)**:处理顶点着色器输出的每个片段(即像素或像素的候选者),决定其最终的颜色和透明度。 在WebGL中,着色器通常使用GLSL(OpenGL Shading Language)编写,这是一种专门用于图形渲染的编程语言。 #### 二、共享变量的概念与应用 在WebGL中,直接意义上的“共享变量”并不直接对应于传统编程语言中的全局变量或静态变量。然而,我们可以通过uniform变量(全局可访问,但由CPU设置)、varying变量(在顶点着色器中定义,传递给片段着色器,实现顶点间数据的插值)以及特定的算法(如纹理映射、颜色插值等)来模拟或实现类似的效果。 对于本章节的目标——绘制一个颜色渐变的正方形,我们将主要利用varying变量和颜色插值技术。 #### 三、绘制颜色渐变正方形的步骤 ##### 1. 准备顶点数据 首先,我们需要定义正方形的四个顶点及其位置。为了实现颜色渐变,我们还需要为每个顶点指定一个颜色值。这里,我们选择正方形的左上角为蓝色(0, 0, 1),右上角为红色(1, 0, 0),右下角为绿色(0, 1, 0),左下角为黄色(1, 1, 0)。 ```javascript const vertices = new Float32Array([ // x, y, r, g, b -0.5, 0.5, 0, 0, 1, // 左上角,蓝色 0.5, 0.5, 1, 0, 0, // 右上角,红色 0.5, -0.5, 0, 1, 0, // 右下角,绿色 -0.5, -0.5, 1, 1, 0 // 左下角,黄色 ]); ``` ##### 2. 创建着色器程序 编写顶点着色器和片段着色器代码。在顶点着色器中,我们将顶点位置和颜色作为attribute传入,并将颜色作为varying变量传递给片段着色器。 **顶点着色器代码示例**: ```glsl attribute vec2 a_position; attribute vec3 a_color; varying vec3 v_color; void main() { gl_Position = vec4(a_position, 0.0, 1.0); v_color = a_color; } ``` **片段着色器代码示例**: ```glsl precision mediump float; varying vec3 v_color; void main() { gl_FragColor = vec4(v_color, 1.0); } ``` 注意:这里虽然直接使用了顶点颜色作为片段颜色,但为了展示渐变效果,我们稍后将通过修改顶点着色器或片段着色器来实现。 ##### 3. 实现颜色渐变 为了实现颜色渐变,我们可以选择在片段着色器中根据片段的位置进行颜色插值。但在这个简单的例子中,由于我们直接使用了顶点的颜色,所以渐变效果并不明显。为了演示,我们可以假设一个更复杂的场景,比如使用纹理映射或计算每个片段相对于正方形中心的距离来动态调整颜色。 然而,为了保持示例的简洁性,我们将通过修改顶点数据来模拟一种简单的水平渐变效果,即从左到右从蓝色过渡到红色。 修改顶点数据如下: ```javascript // 简化示例,仅展示水平渐变 const vertices = new Float32Array([ // x, y, r, g, b -0.5, 0.5, 0, 0, 1, // 左上角,蓝色 -0.25, 0.5, 0, 0.5, 1, // 中间左,蓝紫色 0, 0.5, 0.5, 0, 1, // 中间,紫色 0.25, 0.5, 1, 0, 0.5, // 中间右,红紫色 0.5, 0.5, 1, 0, 0 // 右上角,红色 // ... 类似地设置底部三个顶点的颜色,但保持水平渐变 ]); ``` 注意:这只是一个简化的示例,实际中你可能需要更复杂的逻辑来精确控制颜色渐变。 ##### 4. 渲染循环与结果展示 最后,设置WebGL的渲染循环,将顶点数据和着色器程序绑定到WebGL上下文中,并调用`gl.drawArrays`或`gl.drawElements`来绘制正方形。由于我们已经在顶点数据中包含了颜色信息,并且顶点着色器将这些颜色传递给了片段着色器,因此渲染出的正方形将展示出从蓝色到红色的水平渐变效果。 #### 四、总结 通过本章节的学习,我们了解了如何在WebGL的着色器中使用“共享变量”(通过varying变量和颜色插值技术模拟)来绘制一个颜色渐变的正方形。虽然直接意义上的共享变量在WebGL中并不直接存在,但我们可以利用uniform、attribute和varying变量的特性,以及着色器中的计算逻辑,来实现复杂而强大的图形效果。希望这个示例能够帮助你更好地理解WebGL着色器的强大功能和灵活性。
上一篇:
43 | WebGL介绍(七):了解着色器变量值的绑定及三种三角形绘制模式之间的差异
下一篇:
45 | WebGL介绍(九):完成动画
该分类下的相关小册推荐:
微信小程序与云开发(中)
微信小程序与云开发(上)
微信小程序全栈开发实战(下)
微信小程序与云开发(下)
微信小程序全栈开发实战(中)
微信小程序底层框架实现原理