首页
技术小册
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 | 开放接口(二):优化前后端登录代码,解决后端解密错误
当前位置:
首页>>
技术小册>>
微信小程序全栈开发实战(上)
小册名称:微信小程序全栈开发实战(上)
### 43 | WebGL介绍(七):了解着色器变量值的绑定及三种三角形绘制模式之间的差异 在WebGL的广阔世界里,着色器(Shaders)作为实现高级图形效果的核心组件,扮演着至关重要的角色。它们允许开发者直接在GPU上运行代码,以极高的效率处理图形渲染的每一个细节。本章节将深入探讨着色器变量值的绑定方法,并详细解析WebGL中三种基本的三角形绘制模式及其之间的差异,帮助读者更好地掌握WebGL的精髓。 #### 一、着色器变量值的绑定 在WebGL中,着色器(包括顶点着色器和片元着色器)通过接收来自JavaScript的输入数据来工作。这些输入数据以变量的形式在着色器代码中定义,并通过WebGL API与JavaScript代码进行交互。正确地将JavaScript中的数据绑定到着色器变量上,是实现复杂图形效果的关键步骤。 ##### 1. 均匀变量(Uniform Variables) 均匀变量是那些在着色器执行期间对于所有顶点或片元保持不变的变量。它们非常适合用于传递变换矩阵、光照参数等全局状态信息。绑定均匀变量的方法通常涉及以下几个步骤: - **获取均匀变量的位置**:使用`gl.getUniformLocation(program, uniformName)`方法,其中`program`是着色器程序对象,`uniformName`是均匀变量的名称。 - **设置均匀变量的值**:根据变量的类型(如浮点数、向量、矩阵等),使用相应的WebGL函数(如`gl.uniform1f`、`gl.uniform2fv`、`gl.uniformMatrix4fv`等)来设置其值。 ##### 2. 属性变量(Attribute Variables) 属性变量用于在顶点着色器中传递每个顶点的特定数据,如顶点位置、颜色、纹理坐标等。与均匀变量不同,属性变量的值在每个顶点上可能不同。 - **获取属性变量的位置**:使用`gl.getAttribLocation(program, attributeName)`方法,其中`attributeName`是属性变量的名称。 - **启用属性变量**:在绑定具体数据之前,必须先通过`gl.enableVertexAttribArray(index)`启用该属性,其中`index`是属性变量的位置索引。 - **绑定缓冲区数据到属性变量**:通过`gl.vertexAttribPointer`(对于浮点数据)或类似函数,将缓冲区中的数据与属性变量关联起来,并指定数据的格式、步长等信息。 - **(可选)设置属性变量的默认值**:如果某些顶点数据未明确指定,可以使用`gl.vertexAttrib*`系列函数为属性变量设置默认值。 ##### 3. 注意事项 - **数据类型匹配**:确保JavaScript中设置的数据类型与着色器中声明的类型一致。 - **性能优化**:合理使用均匀变量和属性变量,避免不必要的计算和数据传输。 - **资源管理**:及时释放不再使用的着色器程序和缓冲区资源,避免内存泄漏。 #### 二、三种三角形绘制模式之间的差异 WebGL提供了三种基本的三角形绘制模式,它们决定了如何根据提供的顶点数据绘制三角形。这三种模式分别是:`GL_TRIANGLES`、`GL_TRIANGLE_STRIP`和`GL_TRIANGLE_FAN`。 ##### 1. `GL_TRIANGLES` 这是最直接的绘制模式,每三个顶点定义一个独立的三角形。如果顶点数组中有`n`个顶点,并且`n`是3的倍数,那么将会绘制出`n/3`个三角形。这种模式适用于当每个三角形都是独立存在,且之间没有共享边时。 ```javascript // 假设vertices是一个包含顶点位置的Float32Array gl.drawArrays(gl.TRIANGLES, 0, vertices.length / 3); ``` ##### 2. `GL_TRIANGLE_STRIP` 在这种模式下,每增加一个顶点都会与前面的两个顶点形成一个新的三角形。如果顶点数组中有`n`个顶点,那么将会绘制出`n-2`个三角形。这种模式特别适用于绘制一系列相邻的三角形,因为它们之间共享边。 ```javascript // 使用相同的vertices数组 gl.drawArrays(gl.TRIANGLE_STRIP, 0, vertices.length / 3); ``` 注意,由于顶点间的连接方式不同,使用`GL_TRIANGLE_STRIP`时,顶点数组的顺序变得至关重要。 ##### 3. `GL_TRIANGLE_FAN` 此模式下,第一个顶点作为所有三角形的共享顶点,与随后的每两个顶点形成一个新的三角形。如果有`n`个顶点(`n>=3`),则会绘制出`n-2`个三角形。`GL_TRIANGLE_FAN`适用于绘制以某一点为中心的扇形区域,如圆形或多边形。 ```javascript // 同样使用vertices数组 gl.drawArrays(gl.TRIANGLE_FAN, 0, vertices.length / 3); ``` 在这种模式下,第一个顶点的位置选择直接影响到绘制结果,因为它将是所有三角形的公共顶点。 #### 三、绘制模式的选择与应用 选择合适的三角形绘制模式对于优化渲染性能和实现特定图形效果至关重要。 - 当需要绘制一系列独立、不共享边的三角形时,`GL_TRIANGLES`是最佳选择。 - 如果要绘制一系列相邻的三角形,且这些三角形之间共享边,`GL_TRIANGLE_STRIP`能更有效地利用顶点数据,减少数据传输量。 - 当需要围绕一个中心点绘制一系列三角形时,如圆形或多边形,`GL_TRIANGLE_FAN`则更为方便。 #### 结论 通过深入了解着色器变量值的绑定方法及WebGL中三种三角形绘制模式之间的差异,我们可以更加灵活高效地利用WebGL进行图形编程。无论是实现复杂的视觉效果,还是优化渲染性能,这些知识都是不可或缺的。希望本章节的内容能为读者在WebGL全栈开发的道路上提供有力的支持。
上一篇:
42 | WebGL介绍(六):了解在WebGL中裁剪空间是如何裁剪出来的
下一篇:
44 | WebGL介绍(八):在着色器中使用共享变量,绘制一个颜色渐变的正方形
该分类下的相关小册推荐:
微信小程序与云开发(中)
微信小程序底层框架实现原理
微信小程序与云开发(下)
微信小程序与云开发(上)
微信小程序全栈开发实战(中)
微信小程序全栈开发实战(下)