glsl着色器学习(七)

news2024/11/15 23:39:56

先了解一个矩阵库twgl/m4

是一个4x4 矩阵数学转换函数的库

  1. normalize(a, dst)
    • 将一个向量除以它的欧几里得长度,归一化后返回
    • 参数"a"是一个vec3(三维向量)
    • 参数"dst"是用来接收结果的,如果不传,则创建一个新的
  2. identity(dst)
    • 创建一个n × n 的单位矩阵
    • 参数"dst"是用来接收结果的,如果不传,则返回一个新的n × n 的单位矩阵
  3.  translate(m, v, dstopt)
    • 将给定的 4×4 矩阵转换为给定的向量 v
    • 返回已转换的矩阵
  4.  rotateX(m, angleInRadians, dstopt)
    • 将给定的4 × 4矩阵绕x轴旋转给定的角度。
  5. rotateY(m, angleInRadians, dstopt)
    • 将给定的4 × 4矩阵绕y轴旋转给定的角度。
  6. perspective(fieldOfViewYInRadians, aspect, zNear, zFar, dstopt)
    • 在给定视锥体的角度高度、纵横比以及近剪裁平面和远剪裁平面的情况下,计算 4×4 透视转换矩阵。参数定义沿负 z 方向延伸的视锥体。给定的角度是平截体的垂直角度,水平角度确定以产生给定的纵横比。参数 near 和 far 是到 near 和 far 剪切平面的距离。请注意,near 和 far 不是 z 坐标,而是沿负 z 轴的距离

let texUnit = 6;
gl.activeTexture(gl.TEXTURE0 + texUnit);
gl.bindTexture(gl.TEXTURE_2D, checkerTexture);
gl.uniform1i(diffuseLoc, texUnit);

texUnit = 3;
gl.activeTexture(gl.TEXTURE0 + texUnit);
gl.bindTexture(gl.TEXTURE_2D, decalTexture);
gl.uniform1i(decalLoc, texUnit);

gl.uniform3fv(lightDirLoc, m4.normalize([1, 5, 8]));

const projection = m4.perspective(
  60 * Math.PI / 180,  // fov
  gl.canvas.clientWidth / gl.canvas.clientHeight,  // aspect
  0.1,  // near
  10,   // far
);
gl.uniformMatrix4fv(projectionLoc, false, projection);

// draw center cube

let modelView = m4.identity();
modelView = m4.translate(modelView, 0, 0, -4);
modelView = m4.xRotate(modelView, 0.5);
modelView = m4.yRotate(modelView, 0.5);

gl.uniformMatrix4fv(modelViewLoc, false, modelView);

gl.uniform4fv(diffuseMultLoc, [0.7, 1, 0.7, 1]);

gl.drawElements(
    gl.TRIANGLES,
    36,                // num vertices to process
    gl.UNSIGNED_SHORT, // type of indices
    0,                 // offset on bytes to indices
);

// draw left cube

modelView = m4.identity();
modelView = m4.translate(modelView, -3, 0, -4);
modelView = m4.xRotate(modelView, 0.5);
modelView = m4.yRotate(modelView, 0.8);

gl.uniformMatrix4fv(modelViewLoc, false, modelView);

gl.uniform4fv(diffuseMultLoc, [1, 0.7, 0.7, 1]);

gl.drawElements(
    gl.TRIANGLES,
    36,                // num vertices to process
    gl.UNSIGNED_SHORT, // type of indices
    0,                 // offset on bytes to indices
);

// draw right cube

modelView = m4.identity();
modelView = m4.translate(modelView, 3, 0, -4);
modelView = m4.xRotate(modelView, 0.6);
modelView = m4.yRotate(modelView, -0.6);

gl.uniformMatrix4fv(modelViewLoc, false, modelView);

gl.uniform4fv(diffuseMultLoc, [0.7, 0.7, 1, 1]);

gl.drawElements(
    gl.TRIANGLES,
    36,                // num vertices to process
    gl.UNSIGNED_SHORT, // type of indices
    0,                 // offset on bytes to indices
);

设置纹理单元和绑定纹理

  1. let texUnit = 6; gl.activeTexture(gl.TEXTURE0 + texUnit);
    1. 定义一个纹理单元编号为 6。然后使用 activeTexture函数激活纹理单元 TEXTURE0+ 6,这表示后续对纹理的操作将针对这个特定的纹理单元进行
  2. gl.bindTexture(gl.TEXTURE_2D, checkerTexture);
    1. 将之前创建的棋盘格纹理(checkerTexture)绑定到当前激活的纹理单元上
  3. gl.uniform1i(diffuseLoc, texUnit);
    1. 通过 diffuseLoc(之前获取的统一变量位置)设置片元着色器中的纹理采样器对应的纹理单元编号为 6。这样片元着色器就知道从哪个纹理单元获取基本颜色纹理。

设置光照方向

  1. gl.uniform3fv(lightDirLoc, m4.normalize([1, 5, 8]));
    1. 通过 lightDirLoc(之前获取的统一变量位置)设置片元着色器中的光照方向为经过归一化处理后的向量 [1, 5, 8]。这将影响片元着色器中的光照计算。

设置投影矩阵

  1. const projection = m4.perspective(60 * Math.PI / 180, gl.canvas.clientWidth / gl.canvas.clientHeight, 0.1, 10);
    1. 创建一个透视投影矩阵。参数分别为视野角度(60 度转换为弧度)、画布的宽高比、近裁剪平面距离(0.1)和远裁剪平面距离(10)。
  2. gl.uniformMatrix4fv(projectionLoc, false, projection);
    1. 通过 projectionLoc(之前获取的统一变量位置)将创建的投影矩阵上传到顶点着色器中的 projection统一变量,用于将顶点从视图空间转换到裁剪空间

绘制立方体

  1. let modelView = m4.identity();
    1. 创建一个初始的模型视图矩阵为单位矩阵。
  2. modelView = m4.translate(modelView, 0, 0, -4);
    1. 对模型视图矩阵进行平移操作,将立方体沿 Z 轴负方向移动 -4 个单位,确定其在世界空间中的位置。
  3. modelView = m4.xRotate(modelView, 0.5) 和 modelView = m4.yRotate(modelView, 0.5);
    1. 分别绕 X 轴和 Y 轴旋转模型视图矩阵,旋转角度分别为 0.5。
  4. gl.uniformMatrix4fv(modelViewLoc, false, modelView)
    1. 通过 modelView(之前获取的统一变量位置)将更新后的模型视图矩阵上传到顶点着色器中的 modelView 统一变量,用于将顶点从模型空间转换到视图空间。
  5. gl.uniform4fv(diffuseMultLoc, [0.7, 1, 0.7, 1]);
    1. 设置片元着色器中的 diffuseMultLoc(基本颜色纹理缩放因子)为 [0.7, 1, 0.7, 1],用于调整中心立方体的颜色。
  6. gl.drawElements(gl.TRIANGLES, 36, gl.UNSIGNED_SHORT, 0);
    1. 使用索引缓冲中的数据绘制三角形,绘制模式为 gl.TRIANGLES,处理 36 个顶点索引,索引数据类型为无符号短整型,偏移量为 0。这将绘制出中心的立方体
  7. 左边和右边立方体绘制也是同样的道理,左边立方体沿着X轴负方向移动了3个单位长度,右边立方体沿着X轴正方向移动了3个单位长度。

完结撒花!!!我们了解其渲染过程即可,更多是编辑顶点着色器和片元着色器的内容,对webgl封装较好的上层应用库有threejs和babylonjs。大家可自行尝试

知识来源:WebGL 理论基础 (webglfundamentals.org)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2102758.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【嵌入式体系结构复习资料】

选择: 1. 以下哪个不是嵌入式系统设计的主要目标?( D ) A.低成本 B.低功耗 C.实时要求高 D.超高性能 2. 嵌入式系统有别于其他系统的最大特点是(A )。 A.嵌入专用 B.高可靠 C.…

集成电路学习:什么是LCD液晶显示器

一、LCD:液晶显示器 LCD,全称Liquid Crystal Display,即液晶显示器,是一种平面超薄的显示设备。它由一定数量的彩色或黑白像素组成,放置于光源或者反射面前方。LCD的主要原理是以电流刺激液晶分子产生点、线、面配合背…

mysql 使用 general 开启SQL跟踪功能

查看当前状态 mysql> SHOW VARIABLES LIKE %general%; 启用 临时启用 SET GLOBAL general_logon; SET GLOBAL general_log_file/tmp/general.log; 永久启用 通过修改配置文件来启用,需要重启mysql服务 [mysqld] general_logON general_log_file/tmp/general.log 再次查看状态…

【保姆级教程】如何在Win11上搭建一个GPU环境

CUDA和CUDNN安装 CUDA安装 下载对应cuda环境 下载链接:https://developer.nvidia.com/cuda-downloads,图片下载的是 cuda_12.6.1_560.94_windows.exe 然后一路安装即可: 安装路径如下: CUDNN安装 打开cuDNN下载页面 解压后…

排查SQL Server中的内存不足及其他疑难问题

文章目录 引言I DMV 资源信号灯资源信号灯 DMV sys.dm_exec_query_resource_semaphores( 确定查询执行内存的等待)查询性能计数器什么是内存授予?II DBCC MEMORYSTATUS 查询内存对象III DBCC 命令释放多个 SQL Server 内存缓存 - 临时度量值IV 等待资源池 %ls (%ld)中的内存…

【408DS算法题】034进阶-22年真题_判断顺序存储二叉树是否是BST

Index 真题题目分析实现总结 真题题目 已知非空二叉树T的结点值均为正整数,采用顺序存储方式保存,数据结构定义如下: typedef struct { // MAX_STZE为已定义常量int SqBiTNode[MAX_SIZE]; // 保存二叉树结点值的数组int ElemNum; …

BM3D--Image Denoising by Sparse 3-D Transform-Domain Collaborative Filtering

系列文章目录 文章目录 系列文章目录前言稀疏三维变换域协同滤波图像去噪摘要1 引言2 分组和协作过滤A.分组B.按匹配分组C.协同过滤D.基于变换域收缩的协同过滤 3 算法结论 前言 论文地址 如果下载不了可以从 https://download.csdn.net/download/m0_70420861/89708940 获取 …

Pytorch安装 CUDA Driver、CUDA Runtime、CUDA Toolkit、nvcc、cuDNN解释与辨析

Pytorch的CPU版本与GPU版本 Pytorch的CPU版本 仅在 CPU 上运行,适用于没有显卡或仅使用 CPU 的机器。安装方式相对简单,无需额外配置 CUDA 或 GPU 驱动程序。使用方式与 GPU 版相同,唯一不同的是计算将自动在 CPU 上进行。 Pytorch的GPU版…

VBA学习(63):Excel VBA 数据分析展示/ListView控件/Combox组合框控件/CheckBox复选框控件/科目汇总表

前面我们分享了使用ListVeiw进行数据展示,做出“科目汇总表”来(Excel VBA 数据分析展示/ListView控件、Excel VBA 数据分析展示/ListView控件/Combox组合框控件/科目汇总表(2)),今天,我们继续完善按月查询、按一级科目…

codesys进行控制虚拟轴运动时出现的一些奇怪bug的解释

codesys进行控制虚拟轴运动时出现的一些奇怪bug的解释 问题描述第一个奇怪的bug:新建的工程没有SoftMotion General Axis Pool选项第二个奇怪的bug:在新建工程SoftMotion General Axis Pool选项时,无法手动添加第三个奇怪的bug:虚…

Spring源码之refresh

1.refesh的核心介绍 在 Spring 框架中,refresh 主要用于刷新应用上下文。这一过程涉及多个重要的步骤,确保 Spring 容器的状态更新、bean 的加载以及资源的初始化。 refresh 方法的主要功能 初始化上下文: refresh 方法会初始化应用上下文&…

【项目实战】智能机械臂协同视觉辅助仓储物流管控平台

写在前面: 🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝 个人主页:清流君_CSDN博客,期待与您一同探索 移动机器人 领域的无限可能。 🔍 本文系 清流君 原创之作&…

9月4日星期三今日早报简报微语报早读

9月4日星期三,农历八月初二,早报微语早读。 1、全球第二批100个地质遗产地公布,中国乌海、自贡、桂林等3地入选; 2、我国科学家在超高纯石墨领域取得重大突破; 3、2024上海百强企业榜单发布:入围门槛105…

小土堆pytorch

anaconda安装 pip list 可以看有哪些package包 nvidia-smi查看显卡的状态 安装pytorch 检验pytorch是否安装成功,以及是否pytorch是否可以使用gpu。 (1)查看conda版本 conda --version 或 conda -V (2)更新conda(将conda自身更新到最新版本) …

算法打卡 Day28(回溯算法)-组合总数 + 组合总数 Ⅱ+ 电话号码的字母组合

文章目录 Leetcode 17-电话号码的字母组合题目描述解题思路 Leetcode 39-组合总数题目描述解题思路 Leetcode 216-组合总数 Ⅲ题目描述解题思路 Leetcode 17-电话号码的字母组合 题目描述 https://leetcode.cn/problems/letter-combinations-of-a-phone-number/description/ …

Flink问题记录

尚硅谷Flink1.17问题记录 上手pom依赖循环递归WordCountStreamDemo中readTextFile是deprecated&#xff08;强烈反对的&#xff09; 上手 pom依赖循环递归 pom依赖中&#xff1a; <dependency><groupId>org.apache.flink</groupId><artifactId>flink…

J.U.C Review - 线程池原理/源码解析

文章目录 为什么要使用线程池ThreadPoolExecutor构造方法解析常见的阻塞队列实现及其特性阻塞队列在实际应用中的适用场景分析自定义ThreadFactory和RejectedExecutionHandler实际使用中的示例与代码片段 线程池的状态线程池的任务处理流程线程复用的实现四种常见的线程池newCa…

uniapp 自定义微信小程序 tabBar 导航栏

背景 做了一个校园招聘类小程序&#xff0c;使用 uniapp vue3 uview-plus pinia 构建&#xff0c;这个小程序要实现多角色登录&#xff0c;根据权限动态切换 tab 栏文字、图标。 使用pages.json中配置tabBar无法根据角色动态配置 tabBar&#xff0c;因此自定义tabBar&…

达梦数据库的系统视图v$ifun

达梦数据库的系统视图v$ifun 达梦数据库&#xff08;DM Database&#xff09;中V$IFUN 视图是用于检测函&#xff08;Function&#xff09;信息的。 在 Oracle 数据库中&#xff0c;类似的系统视图被称为动态性能视图&#xff0c;但在达梦数据库中并没有与 Oracle 一一对应的…

QT(1)-.pro 文件 转成.vcxproj 工程

1.qtcreator创建的文件转换成vs2019可以打开的。 1.QT webenginewidgets unknown modules webenginewidgets 要用 MSVC2017 &#xff0c;用minGW 32构建