OpenGL3.3_C++_Windows(27)

法线/凹凸贴图

  • 如何让纹理产生更细节的效果,产生凹凸视觉感?
  • 解决思路之一:镜面贴图(黑—白)((diffuse贴图(rgba)),阻止部分表面被照的更亮,但这并不是一个好方案。我们需要模拟深度这样的细节的方式。而非反射效果。
  • 是什么使表面被视为完全平坦的表面来照亮?答案是法线向量,第二个解决方案:
  • 法线/凹凸贴图(偏蓝色调的纹理):替代一个面上所有fragment为法线贴图采样,模拟凹凸感,细节获得了极大提升,开销却不大
  • 纹理:存储颜色,深度值,模板值,法线向量……

基本概念

  • 将法线向量的x、y、z元素储存到纹理中,代替颜色的r、g、b(红,绿,蓝大部分法线指向z轴,所以大部分都为蓝色)元素。
  • 用纹理储存法线向量:法线向量的范围在-1到1之间,所以我们先要将其映射到0到1的范围(* 0.5 + 0.5;):将法线向量变换为像这样的RGB颜色元素,我们就能保存在2D纹理中
  • 注意,我们真正使用的法线贴图,是上下颠倒的,OpenGL读取的纹理的y(或V)坐标和纹理通常被创建的方式相反
  • 从法线贴图采样的法线颜色从0到1重新映射回-1到1(* 2.0 - 1.0),便能将RGB颜色重新处理成法线

当我们旋转实体,

  • 光照看起来完全不对(普通的normal可以*model变换到世界坐标),原因:法线贴图里面的所有法线向量依旧是指向正z方向的
  • 为什么要有切线空间?我们也可以针对每个变换,新建特定的法线贴图,但那太麻烦了,需要任意的变换法线朝向,可以复用的法线贴图

  • 切线空间tangent space)局部坐标系统xyz:
  • TBN向量:切线空间的3个向量:tangent切线(右->三角形面)、bitangent副切线(前->三角形面),normal法线(上->法向量)
  • 对于一个quad有2个三角形,需要求每个三角形的TBN,每个三角形的每个顶点的TBN都是一样的,有了这个图中的转换公式,就可以求出TB了
  • 求TB单位向量:
  • 已知顶点坐标(求边E)和纹理坐标(求差U与T方向相同,V与𝐵方向相同),边向量E = 向量1 UT + 向量2VB (向量加法),分解为矩阵xyz3个分量,
  • 平滑:
  • 通常三角形和三角形之间都会共享顶点。这种情况下开发者通常将每个顶点的法线和切线/副切线等顶点属性平均化,以获得更加柔和的效果。
TBN

在glsl中创建mat3 TBN,如何使用它?

  • TBN矩阵:切线空间转成世界或视图空间下,从法线贴图采样法线,映射回-1到1,*TBN变换到世界空间
  • TBN逆矩阵:世界或视图空间下转成切线空间中
  • 注意,这里用到置换函数transpose,而非求逆函数inverse,对于正交矩阵(每个轴既是单位向量同时相互垂直)的一大属性是一个正交矩阵的置换矩阵与它的逆矩阵相等。因为逆矩阵的求得比求置换开销大;结果却是一样的。
  • 第二种方法看似要做的更多,为何还第二种方法呢?
  • uniform变量(对本shader属于全局的,唯一的,所以每次每个片段运行都是一致的),完全可以在vertex去计算,顶点着色器通常比像素着色器运行的少。这是一个极佳的优化。对于法线每个顶点运行fragment shader都是不同的,采样的都是不一致的,所以必须放在fragment shader中

为模型应用法线贴图

无Normal_Texture
应用Normal_Texture->TBN
  • 图中:可以看到应用了Normal_Texture->TBN后的model,显示的更加立体,凹凸感。
  • assimp库当ReadFile()调用aiProcess_CalcTangentSpace来加载场景scene时,Assimp会为每个加载的顶点计算出柔和的切线和副切线向量
  • 通过mesh->mTangents[i].获取切线空间
  • loadMaterialTextures时需要aiTextureType_NORMAL加载法线贴图
  • //
  • 格拉姆-施密特正交化: (不必花费太多性能开销的情况下稍稍提升画质表现)
  • 更大的网格上计算切线向量的时候,它们往往有很大数量的共享顶点,当法向贴图应用到这些表面时将切线向量平均化时通常能获得更好更平滑的结果。就是TBN向量可能会不能互相垂直
  • 重正交化:T = normalize(T - dot(T, N) * N)

矩阵:

  • 矩阵乘法:A(mx) * B(yn) = C(mn),注意:xy必须相等,才可以相乘
  • 行列式determinant:计算方法((基本算法,其余还包括:代数余子式,等价转化法,逆序数法……)
    • 对角线法:斜对角线(左下右上)每条相乘后相加  - 斜对角线(左上右下)每条相乘后相加 
    • 作用:应用于求逆矩阵的过程
  • 转置transpose A^T:横读竖写
  • 伴随矩阵A*:
    • 分量aij的余子式Mij:对于矩阵A,将i行j列划去后,剩余的分量按照原顺序排列得到的n-1阶矩阵,所确定的行列式
    • 分量aij的代数余子式Aij:符号(-1^i+j) * Mij
    • A的伴随矩阵A*:由各分量aij的代数余子式Aij构成
    • 计算过程:
      • 首先求解每个分量的Mij
      • 再计算符号*Mij
    • 应用:线性方程组:把每个系数写为矩阵中的对应分量……
    • 作用:应用于求逆矩阵的过程
  • 逆矩阵inverse A^-1:
    • 和倒数原理一样,x * 1/x = 1; A * A^-1(因为矩阵不能被除) = 单位矩阵(对角线上的数字都是1,其他地方都是0)
    • 如何计算一个矩阵的逆矩阵A^-1?(基本算法,其余还包括初等变换……)
      • 待定系数法:新建矩阵X,对应分量写成等式 == 单位矩阵的对应分量,求系数,即逆矩阵
      • 伴随矩阵:  伴随矩阵  / 行列式 (float) (或 * 1/行列式)
    • 普通除法:已知a * x = b,求x,x = b / a == b * (1/a) ->应用于矩阵
    • 矩阵:A * X = B,我们可以通过 (B/A->)B * A^-1,求出X矩阵(相当于除法的作用

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

二叉树的前中后序遍历(递归法、迭代法)leetcode144、94/145

leetcode144、二叉树的前序遍历 给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 示例 1: 输入:root [1,null,2,3] 输出:[1,2,3] 示例 2: 输入:root [] 输出:[] 示例 3: 输…

第T3周:天气识别

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 一、前期工作 本文将采用CNN实现多云、下雨、晴、日出四种天气状态的识别。较上篇文章,本文为了增加模型的泛化能力,新增了Dropout层并…

持续直击WCCI 2024:金耀初教授、台湾省台北分会等获殊荣 横滨夜景美不胜收

持续直击WCCI 2024:金耀初教授、台湾省台北分会等获殊荣!横滨夜景美不胜收! 会议之眼 快讯 会议介绍 IEEE WCCI(World Congress on Computational Intelligence)2024,即2024年IEEE世界计算智能大会&…

金融科技企业的数据治理与合规挑战:平衡创新与监管的关键战役

在当今数字化浪潮汹涌的时代,金融科技企业如雨后春笋般崛起,以其创新的技术和服务模式为金融行业带来了前所未有的变革。然而,伴随着业务的快速发展,数据治理与合规挑战也日益凸显,成为了金融科技企业必须直面的关键问…

Java房屋租赁管理系统附论文

作者介绍:计算机专业研究生,现企业打工人,从事Java全栈开发 主要内容:技术学习笔记、Java实战项目、项目问题解决记录、AI、简历模板、简历指导、技术交流、论文交流(SCI论文两篇) 上点关注下点赞 生活越过…

Python高速下载及安装的十大必备事项与C++联调

选择正确的版本: 访问Python官网(https://www.python.org/)下载最新稳定版本,目前最新稳定版本为3.12.4 避免下载并安装Python 2.x版本,因为它已经停止维护。 选择适合操作系统的安装包: 根据你的操作系…

IPFoxy Tips:为什么要选择动态住宅代理IP?

在大数据时代的背景下,代理IP成为了很多企业顺利开展的重要工具。代理IP地址可以分为住宅代理IP地址和数据中心代理IP地址。选择住宅代理IP的好处是可以实现真正的高匿名性,而使用数据中心代理IP可能会暴露自己使用代理的情况。 住宅代理IP是指互联网服务…

一场别开生面的python应用实战案例

学好python,改变人生! 最近看了央视旗下的玉渊潭天微博介绍了菲律宾control我们sina微博的视频,这是一个难得的python实战案例,至少有四五个python重要硬核方向值得研究,所以今天写一下这个相关的一些技术领域&#xf…

Redis持久化的三种方式(RDB、AOF和混合)

Redis持久化的三种方式(RDB、AOF和混合) 目录 Redis持久化的三种方式(RDB、AOF和混合)介绍RDB示例1.配置文件2.触发 RDB 快照保存3.验证 AOF示例1.配置文件2.校验 混合型持久化存储配置文件 介绍 Redis数据主要存储与内存中,因此如果服务器意外重启、宕机、崩溃&am…

elementui中@click短时间内多次触发,@click重复点击,做不允许重复点击处理

click快速点击&#xff0c;发生多次触发 2.代码示例&#xff1a; //html<el-button :loading"submitLoading" type"primary" click"submitForm">确 定</el-button>data() {return {submitLoading:false,}}//方法/** 提交按钮 */sub…

页面替换菜单栏图标

图标素材库&#xff1a;https://www.iconfont.cn/?spma313x.collections_index.i3.2.51703a81hOhc8B 1、找到自己喜欢的图标下载svg 2、添加到icons中 3、在components中创建对应的vue页面添加对应图标svg中代码 4、在router中引入 5、在对应的菜单下使用图标

复旦大学:一个小技巧探测大模型的知识边界,有效消除幻觉

孔子说“知之为知之&#xff0c;不知为不知&#xff0c;是知也”&#xff0c;目前的大模型非常缺乏这个能力。虽然大模型拥有丰富的知识&#xff0c;但它仍然缺乏对自己知识储备的正确判断。近年来LLMs虽然展现了强大的能力&#xff0c;但它们偶尔产生的内容捏造&#xff0c;即…

基于改进YOLOv5s的跌倒行为检测 | 引入SKAttention注意机制 + 引入空间金字塔池化结构SPPFCSPC + 结合ASFF自适应空间融合

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。为了实现电厂人员跌倒行为的实时检测&#xff0c;防止跌倒昏迷而无法及时发现并救援的事件发生&#xff0c;针对跌倒行为检测实时性以及特征提取能力不足的问题&#xff0c;提出了一种改进YOLOv5s的跌倒行为检测算法网络&a…

MySQL期末答辩—仓库管理系统

仓库管理系统&#xff1a;仓库管理系统是一种基于互联网对实际仓库的管理平台&#xff0c;旨在提供一个方便、快捷、安全的存取货物和查询商品信息平台。该系统通过在线用户登录查询&#xff0c;可以线上操作线下具体出/入库操作、查询仓库商品信息、提高仓库运作效率&#xff…

一文包学会ElasticSearch的大部分应用场合

ElasticSearch 官网下载地址&#xff1a;Download Elasticsearch | Elastic 历史版本下载地址1&#xff1a;Index of elasticsearch-local/7.6.1 历史版本下载地址2&#xff1a;Past Releases of Elastic Stack Software | Elastic ElasticSearch的安装(windows) 安装前所…

1000T的文件怎么能快速从南京传到北京?最佳方案你肯定想不到

今天刷面试题看到一个有意思的面试题&#xff0c; 1000T的文件怎么能以最快速度从南京传到北京&#xff1f; 网络传输 首先我们考虑通过网络传输&#xff0c;需要多长时间。 我特地咨询了在运营商工作的同学&#xff0c;目前带宽&#xff1a; 家庭宽带下行最大1Gbps&#…

双指针系列第 8 篇:盛水最多的容器。几句话讲明白!

Leetcode 题目链接 思路 取首尾双指针和水量如下所示&#xff0c;设高度函数为 h ( i ) h(i) h(i)&#xff0c;在下图中 h ( l ) < h ( r ) h(l) < h(r) h(l)<h(r)。 观察以 l l l 为左边界所能构成的其他水量&#xff0c;与矮的右边界搭配结果如下。 与高的…

每日两题 / 20. 有效的括号 155. 最小栈(LeetCode热题100)

20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 遇到左括号入栈 遇到右括号判断栈顶是否为匹配的左括号 最后判断栈是否为空 func isValid(s string) bool {var stk []runefor _, value : range s {if value ( || value { || value [ {stk append(stk, value)}…

计算机操作系统部分选填及大题整理

并发和&#xff08; 共享 &#xff09; 是操作系统的两个最基本的特征,&#xff08; 虚拟 &#xff09;和&#xff08; 异步 &#xff09; 是操作系统的重要特征&#xff0c;并发执行的程序失去可再现性现代操作系统的两个基本特征是&#xff08;程序的并发执行&#xff09;和资…

Docker 部署 Minio 对象存储服务器

文章目录 Github官网文档简介dockerdocker-compose.ymlmc 客户端mc 基础命令Golang 示例创建 test 账号密钥文件上传示例 Github https://github.com/minio/minio 官网 https://min.io/https://www.minio.org.cn/ 文档 https://www.minio.org.cn/docs/minio/kubernetes/up…