首页
技术小册
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 | 开放接口(二):优化前后端登录代码,解决后端解密错误
当前位置:
首页>>
技术小册>>
微信小程序全栈开发实战(上)
小册名称:微信小程序全栈开发实战(上)
### 40 | WebGL介绍(四):重新认识右手坐标系及如何编写顶点着色器代码 在WebGL的广阔世界中,深入理解坐标系统和着色器编程是通往高性能3D图形应用的必经之路。本章将带您深入探索WebGL中至关重要的右手坐标系概念,并手把手教您如何编写顶点着色器(Vertex Shader)代码,这是实现3D图形渲染的基础。 #### 40.1 右手坐标系的奥秘 在三维图形学中,坐标系的选择对于物体的定位、旋转和缩放至关重要。WebGL遵循OpenGL的传统,采用**右手坐标系**。与数学和物理中常见的左手坐标系相比,右手坐标系在视觉表示和计算上有其独特的优势,特别是在处理光照、阴影和摄像机变换时。 ##### 40.1.1 右手坐标系的定义 - **X轴**:通常指向屏幕右侧。 - **Y轴**:垂直向上,符合大多数图形界面的直观感受。 - **Z轴**:根据右手定则确定,即右手拇指指向Z轴正方向,弯曲的四指从X轴正方向旋转90度到Y轴正方向。这一规则确保了当您面向屏幕时,Z轴的正方向是“穿出”屏幕。 ##### 40.1.2 为什么选择右手坐标系? WebGL及OpenGL之所以选择右手坐标系,部分原因在于历史沿袭和计算上的便利。此外,右手坐标系在处理某些类型的数学运算(如叉积)时,能够保持方向的一致性,减少混淆。同时,它也便于与某些物理定律(如电磁学中的右手定则)保持一致,虽然这在图形渲染中并非直接相关,但有助于构建统一的认知体系。 ##### 40.1.3 实践中的右手坐标系 在实际开发中,当您使用WebGL进行3D建模、场景构建或摄像机控制时,需要时刻铭记右手坐标系的规则。例如,当您绕Y轴旋转物体时,正方向是顺时针(面向Z轴正方向看),这与我们日常经验中的顺时针旋转方向(面向物体顶部看)可能有所不同,但正是这种差异让WebGL的3D世界更加符合逻辑和一致。 #### 40.2 顶点着色器基础 顶点着色器是WebGL着色器语言GLSL(OpenGL Shading Language)编写的程序,负责处理图形的顶点数据。顶点数据包括位置、颜色、纹理坐标等,经过顶点着色器处理后,会被传递给后续的图元组装和光栅化阶段,最终形成屏幕上可见的像素。 ##### 40.2.1 顶点着色器的作用 - **变换顶点位置**:根据模型、视图和投影矩阵,将顶点的局部坐标转换为屏幕坐标。 - **计算顶点属性**:如颜色、法线等,这些属性可能基于顶点的位置或其他输入属性计算得出。 - **传递数据给片元着色器**:顶点着色器可以计算出并传递一些数据给片元着色器,用于进一步的渲染处理。 ##### 40.2.2 GLSL语言简介 GLSL是一种类似于C的着色器语言,专为图形处理器(GPU)设计,具有高并行性和低延迟的特点。在GLSL中,顶点着色器通常定义为一个`#version`指令开始的程序,包含多个输入、输出和统一变量(uniform),以及执行顶点处理操作的函数`main()`。 ##### 40.2.3 编写顶点着色器代码示例 下面是一个简单的顶点着色器示例,它接受顶点的位置作为输入,将其乘以一个变换矩阵(这里假设为`u_modelViewProjectionMatrix`),并将结果输出到`gl_Position`内置变量,用于后续的渲染管线处理。 ```glsl #version 300 es precision highp float; // 输入变量 in vec4 a_position; // 统一变量(从CPU传递) uniform mat4 u_modelViewProjectionMatrix; // 输出变量 out vec4 v_color; // 假设我们还想传递颜色信息到片元着色器 void main() { // 变换顶点位置 gl_Position = u_modelViewProjectionMatrix * a_position; // 假设我们给所有顶点赋予相同的颜色(这里仅为示例) v_color = vec4(1.0, 0.0, 0.0, 1.0); // 红色 } ``` 在这个例子中,`a_position`是顶点着色器的输入变量,代表顶点的位置。`u_modelViewProjectionMatrix`是一个统一变量,用于存储从CPU传递到GPU的变换矩阵。`gl_Position`是GLSL内置的输出变量,用于存储变换后的顶点位置。`v_color`是我们自定义的输出变量,用于将颜色信息传递给片元着色器。 #### 40.3 深入理解与实践 编写顶点着色器只是WebGL开发中的一小步,但要精通此技能,还需要不断实践和学习。以下是一些建议,帮助您更深入地理解和掌握顶点着色器编程: - **学习GLSL语言**:深入了解GLSL的语法、数据类型、控制流、函数等基本概念。 - **掌握变换矩阵**:理解模型、视图和投影矩阵的作用及其如何影响顶点的位置。 - **实践案例**:通过实现简单的3D图形(如立方体、球体等)来巩固所学知识。 - **阅读文档和教程**:WebGL和GLSL的官方文档是宝贵的资源,同时也有许多优秀的在线教程和书籍可供参考。 - **性能优化**:了解GPU的工作原理,学习如何通过优化着色器代码来提高渲染性能。 通过本章的学习,您应该对WebGL中的右手坐标系有了更深入的理解,并掌握了编写基本顶点着色器的方法。这将是您探索WebGL广阔世界、实现复杂3D图形应用的重要一步。随着实践的深入,您将能够编写出更加高效、灵活的着色器代码,为用户带来更加震撼的视觉效果。
上一篇:
39 | WebGL介绍(三):了解WebGL的世界坐标系
下一篇:
41 | WebGL介绍(五):学习片断着色器编写,了解变量修饰变型uniform与attribute
该分类下的相关小册推荐:
微信小程序与云开发(上)
微信小程序与云开发(中)
微信小程序全栈开发实战(中)
微信小程序全栈开发实战(下)
微信小程序底层框架实现原理
微信小程序与云开发(下)