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.rhkb.cn/news/367714.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不是大厂云用不起,而是五洛云更有性价比

明月代维的一个客户的大厂云境外云服务器再有几天就到期了,续费提醒那是提前一周准时到来,但是看到客户发来的续费价格截图,我是真的没忍住。这不就是在杀熟吗?就这配置续费竟然如此昂贵?说实话这个客户的服务器代维是…

ForkJoin框架与工作窃取算法详解

文章目录 一、ForkJoin框架概述1_核心概念2_主要类和方法1_ForkJoinPool2_ForkJoinTask 二、启用异步模式与否的区别三、ForkJoinPool的三种任务提交方式四、执行逻辑及使用示例1_示例&#xff1a;并行计算数组元素和2_forkJoinPool.submit3_ForkJoinTask<?>中任务的执行…

Web3 前端攻击:原因、影响及经验教训

DeFi的崛起引领了一个创新和金融自由的新时代。然而&#xff0c;这种快速增长也吸引了恶意行为者的注意&#xff0c;他们试图利用漏洞进行攻击。尽管很多焦点都集中在智能合约安全上&#xff0c;但前端攻击也正在成为一个重要的威胁向量。 前端攻击的剖析 理解攻击者利用前端漏…

uniapp标题水平对齐微信小程序胶囊按钮及适配

uniapp标题水平对齐微信小程序胶囊按钮及适配 状态栏高度胶囊按钮的信息计算顶部边距模板样式 标签加样式加动态计算实现效果 t是胶囊按钮距离的top h是胶囊按钮的高度 s是状态栏高度 大概是这样 状态栏高度 获取系统信息里的状态栏高度 const statusBarHeight uni.getSy…

使用CubeIDE调试项目现stm32 no source available for “main() at 0x800337c:

使用CubeIDE调试项目现stm32 no source available for "main() at 0x800337c&#xff1a; 问题描述 使用CubeIDE编译工程代码和下载都没有任何问题&#xff0c;点击Debug调试工程时&#xff0c;出现stm32 no source available for "main() at 0x800337c 原因分析&a…

数据结构与算法笔记:实战篇 - 剖析微服务接口鉴权限流背后的数据结构和算法

概述 微服务是最近几年才兴起的概念。简单点将&#xff0c;就是把复杂的大应用&#xff0c;解耦成几个小的应用 。这样做的好处有很多。比如&#xff0c;这样有利于团队组织架构的拆分&#xff0c;比较团队越大协作的难度越大&#xff1b;再比如&#xff0c;每个应用都可以独立…

nginx优化和防盗链

1、隐藏版本号 [roottest1 conf]# vim nginx.conf ​ server_tokens off; ​ 2、防盗链 修改用户和所在组 [roottest1 conf]# vim nginx.conf ​ #user nginx nginx; #表示主进程master会有root创建&#xff0c;子进程会有nginx用户来创建。 3、设置页面的缓存时间 主要是…

2024-2025年本田维修电路图线路图接线图资料更新

此次更新了2024-2025年本田车系电路图资料&#xff0c;覆盖市面上99%车型&#xff0c;包括维修手册、电路图、新车特征、车身钣金维修数据、全车拆装、扭力、发动机大修、发动机正时、保养、电路图、针脚定义、模块传感器、保险丝盒图解对照表位置等等&#xff01; 汽修帮手汽…

15- 22题聚合函数 - 高频 SQL 50 题基础版

目录 1. 相关知识点2. 例子2.15 - 有趣的电影2.16 - 平均售价2.17 - 项目员工 I2.18 - 各赛事的用户注册率2.19 - 查询结果的质量和占比2.20 - 每月交易 I2.21 - 即时食物配送 II2.22 - 游戏玩法分析 IV 1. 相关知识点 函数 函数含义order by排序group by分组between 小值 an…

Sping源码(九)—— Bean的初始化(非懒加载)—mergeBeanDefinitionPostProcessor

序言 前几篇文章详细介绍了Spring中实例化Bean的各种方式&#xff0c;其中包括采用FactoryBean的方式创建对象、使用反射创建对象、自定义BeanFactoryPostProcessor以及构造器方式创建对象。 创建对象 这里再来简单回顾一下对象的创建&#xff0c;不知道大家有没有这样一个疑…

边缘混合计算智慧矿山视频智能综合管理方案:矿山安全生产智能转型升级之路

一、智慧矿山方案介绍 智慧矿山是以矿山数字化、信息化为前提和基础&#xff0c;通过物联网、人工智能等技术进行主动感知、自动分析、快速处理&#xff0c;实现安全矿山、高效矿山的矿山智能化建设。旭帆科技TSINGSEE青犀基于图像的前端计算、边缘计算技术&#xff0c;结合煤…

【原创实现 设计模式】Spring+策略+模版+工厂模式去掉if-else,实现开闭原则,优雅扩展

1 定义与优点 1.1 定义 策略模式&#xff08;Strategy Pattern&#xff09;属于对象的⾏为模式。他主要是用于针对同一个抽象行为&#xff0c;在程序运行时根据客户端不同的参数或者上下文&#xff0c;动态的选择不同的具体实现方式&#xff0c;即类的行为可以在运行时更改。…

WIN32核心编程 - 数据类型 错误处理 字符处理

公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 数据类型 基本数据类型 Win32基本数据类型 错误处理 C语言中的错误处理 C中的错误处理 Win32中的错误处理 字符处理 C/C WIN32 字符处理 数据类型 基本数据类型 C/C语言定义了一系列…

双指针系列第 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;与矮的右边界搭配结果如下。 与高的…

Vue移动端地图App:van-uploader导致的卡顿问题

问题描述 基于Vue3+Vant IU 4开发的移动端地图App,在进行地图点位上报、上报记录查看过程中,出现App卡顿、甚至闪退的问题,进行问题定位之后,发现是van-uploader组件导致的问题。 van-uploader文件上传组件 van-uploader组件用于将本地的图片或文件上传至服务器,并在上传…

GOROOT GOPATH GOPROXY GO111MODULE

GOROOT GOROOT代表Go的安装目录。可执行程序go(或go.exe)和gofmt(或gofmt.exe)位于 GOROOT/bin目录中。 配置GOROOT环境变量&#xff0c;其值为Go的安装目录&#xff1b;然后在环境变量PATH中添加GOROOT/bin路径。 注意&#xff1a;GOROOT变量只是代表了安装目录&#xff0c;不…

Python基础小知识问答系列-可迭代型变量赋值

1. 问题&#xff1a; 怎样简洁的把列表中的元素赋值给单个变量&#xff1f; 当需要列表中指定几个值时&#xff0c;剩余的变量都收集在一起&#xff0c;该怎么进行变量赋值&#xff1f; 当只需要列表中指定某几个值&#xff0c;其他值都忽略时&#xff0c;该怎么…

红酒与建筑:品味历史与艺术的交汇

在时间的长河中&#xff0c;红酒与建筑都是人类智慧的结晶&#xff0c;它们各自承载着历史的厚重与艺术的韵味。当这两者交汇时&#xff0c;仿佛是一场穿越时空的对话&#xff0c;将我们带入一个既古老又现代、既深沉又温柔的世界。今天&#xff0c;就让我们一起走进这个奇妙的…

【前端VUE】VUE3第一节—vite创建vue3工程

什么是VUE Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的界面&#xff0…

网页计算器的实现

简介 该项目实现了一个功能完备、交互友好的网页计算器应用。只使用了 HTML、CSS 和 JavaScript &#xff0c;用于检验web前端基础水平。 开发环境&#xff1a;Visual Studio Code开发工具&#xff1a;HTML5、CSS3、JavaScript实现效果 功能设计和模块划分 显示模块&#…