Unity中Shader裁剪空间推导(正交相机到裁剪空间的转化矩阵)

文章目录

  • 前言
  • 一、正交相机 转化到 裁剪空间 干了什么
    • 1、正交相机裁剪的范围主要是这个方盒子
    • 2、裁剪了之后,需要把裁剪范围内的坐标值化到[-1,1]之间,这就是我们的裁剪空间。
    • 3、在Unity中,设置相机为正交相机
    • 4、在这里设置相机的近裁剪面和远裁剪面
  • 二、把正交相机的方盒子内的坐标 转化到 裁剪空间
    • 1、我们在Unity创建两个游戏对象来解释
    • 2、正交相机坐标 到 裁剪坐标 的映射关系
    • 3、化简X轴坐标
    • 4、化简Y轴坐标
    • 5、化简Z坐标(OpenGL下 [-1,1])
    • 6、化简Z坐标(DirectX下 [0,1])
  • 三、把转化后的坐标转化为矩阵
    • 1、OpenGL下
    • 2、DirectX


前言

我们把顶点坐标信息转化为裁剪空间。有可能使用到正交相机信息 或 透视相机。我们在这篇文章中,推导一下正交相机下的裁剪空间。

在这里插入图片描述

  • 本地空间->世界空间->观察空间->裁剪空间->屏幕映射

一、正交相机 转化到 裁剪空间 干了什么

1、正交相机裁剪的范围主要是这个方盒子

  • 因为使用的是右手坐标系。所以,摄像机的Z轴正方向是在X轴正方向右侧的。

在这里插入图片描述

2、裁剪了之后,需要把裁剪范围内的坐标值化到[-1,1]之间,这就是我们的裁剪空间。

  • 在不同平台下裁剪空间的X 和 Y轴范围都是[-1,1]
  • OpenGL下,Z范围[-1,1]
  • DirectX下,Z范围[0,1]
    在这里插入图片描述

3、在Unity中,设置相机为正交相机

  • Unity视图窗口使用了左手坐标系,Z轴正方向 在 X轴正方向左侧。但是,我们计算使用的是右手坐标系,这里需要注意。
    在这里插入图片描述

4、在这里设置相机的近裁剪面和远裁剪面

在这里插入图片描述


二、把正交相机的方盒子内的坐标 转化到 裁剪空间

1、我们在Unity创建两个游戏对象来解释

在这里插入图片描述

  • 我们的绿线Cube相当于我们的裁剪空间
  • 我们的大长方体相当于世界空间下的游戏对象
  • 当我们进行转化时,对大长方体进行缩放、平移即可转化到裁剪空间

2、正交相机坐标 到 裁剪坐标 的映射关系

在这里插入图片描述

  • l ≤ x ≤ r l \leq x \leq r lxr 化为 -1 ≤ x ≤ \leq x \leq x 1
  • b ≤ y ≤ t b \leq y \leq t byt 化为 -1 ≤ x ≤ \leq x \leq x 1
  • f ≤ z ≤ n f\leq z \leq n fzn 化为 -1 ≤ x ≤ \leq x \leq x 1

3、化简X轴坐标

l ≤ x ≤ r l \leq x \leq r lxr

l − l ≤ x − l ≤ r − l l - l \leq x - l \leq r - l llxlrl

0 ≤ x − l ≤ r − l 0 \leq x - l \leq r - l 0xlrl

0 ≤ x − l 2 r − l ≤ r − l 2 r − l 0 \leq x - l \frac{2}{r - l} \leq r - l \frac{2}{r - l} 0xlrl2rlrl2

0 ≤ 2 x − 2 l r − l ≤ 2 0 \leq \frac{2x - 2l }{r - l} \leq 2 0rl2x2l2

− 1 ≤ 2 x − 2 l r − l − 1 ≤ 1 -1 \leq \frac{2x - 2l }{r - l} - 1\leq 1 1rl2x2l11

− 1 ≤ 2 x − 2 l r − l − r − l r − l ≤ 1 -1 \leq \frac{2x - 2l }{r - l} - \frac{r - l}{r - l}\leq 1 1rl2x2lrlrl1

− 1 ≤ 2 x − l − r r − l ≤ 1 -1 \leq \frac{2x - l -r }{r - l} \leq 1 1rl2xlr1

  • l = − r , r = − l l = -r,r = -l l=r,r=l
    我们在Unity中看出,我们的正交相机是处于裁剪面中央的。
    所以,我们的裁剪面x、y坐标,在摄像机空间下,是对称的。所以 r 和 l 是相反数。

    在这里插入图片描述

− 1 ≤ 2 x − ( − r ) − r r − ( − r ) ≤ 1 -1 \leq \frac{2x - (-r) -r }{r - (-r)} \leq 1 1r(r)2x(r)r1

− 1 ≤ 2 x 2 r ≤ 1 -1 \leq \frac{2x}{2r} \leq 1 12r2x1

  • w = 2 l = 2 r w = 2l = 2r w=2l=2r

(w为我们正交相机方盒子的宽,这里在Unity中是未知的,我们这里先假设为w。后期可以化简为比值法从而不需要知道w的值)

我们已知的是:
正交相机方盒子的高 Size(等于Unity单位值的2倍)
正交相机的近远裁剪面(Z值)

在这里插入图片描述
在这里插入图片描述

− 1 ≤ 2 x w ≤ 1 -1 \leq \frac{2x}{w} \leq 1 1w2x1

4、化简Y轴坐标

b ≤ y ≤ t b \leq y \leq t byt

b − b ≤ y − b ≤ t − b b - b\leq y - b \leq t - b bbybtb

0 ≤ y − b ≤ t − b 0\leq y - b \leq t - b 0ybtb

0 ≤ y − b 2 t − b ≤ t − b 2 t − b 0\leq y - b\frac{2}{t - b} \leq t - b\frac{2}{t - b} 0ybtb2tbtb2

0 ≤ 2 y − 2 b t − b ≤ 2 0\leq \frac{2y - 2b}{t - b} \leq 2 0tb2y2b2

− 1 ≤ 2 y − 2 b t − b − 1 ≤ 1 -1\leq \frac{2y - 2b}{t - b} - 1\leq 1 1tb2y2b11

− 1 ≤ 2 y − 2 b t − b − t − b t − b ≤ 1 -1\leq \frac{2y - 2b}{t - b} - \frac{t - b}{t - b}\leq 1 1tb2y2btbtb1

− 1 ≤ 2 y − b − t t − b ≤ 1 -1\leq \frac{2y - b - t}{t - b}\leq 1 1tb2ybt1

  • b = − t , b = − t b = -t,b = -t b=t,b=t
    我们在Unity中看出,我们的正交相机是处于裁剪面中央的。
    所以,我们的裁剪面x、y坐标,在摄像机空间下,是对称的。所以 b 和 t 是相反数。

    在这里插入图片描述

− 1 ≤ 2 y − ( − t ) − t t − ( − t ) ≤ 1 -1\leq \frac{2y - (-t) - t}{t - (-t)}\leq 1 1t(t)2y(t)t1

− 1 ≤ 2 y + t − t t + t ≤ 1 -1\leq \frac{2y + t - t}{t + t}\leq 1 1t+t2y+tt1

− 1 ≤ 2 y 2 t ≤ 1 -1\leq \frac{2y}{2t}\leq 1 12t2y1

  • h = 2 b = 2 t h = 2b = 2t h=2b=2t

(h为我们正交相机方盒子的高,这里先假设h代替)

− 1 ≤ 2 y h ≤ 1 -1\leq \frac{2y}{h}\leq 1 1h2y1

5、化简Z坐标(OpenGL下 [-1,1])

在这里插入图片描述
因为我们观察空间是右手坐标系。但是,我们裁剪空间是左手坐标系。所以,这里需要化简的式子需要变化一下。(左手坐标系Z轴正方向与上图相反)

  • f ≤ z ≤ n f\leq z \leq n fzn 变为 − n ≤ z ≤ − f -n\leq z \leq -f nzf

− n ≤ z ≤ − f -n\leq z \leq -f nzf

0 ≤ z + n ≤ n − f 0\leq z + n \leq n-f 0z+nnf

0 ≤ z + n 2 n − f ≤ n − f 2 n − f 0\leq z + n \frac{2}{n - f} \leq n - f \frac{2}{n - f} 0z+nnf2nfnf2

0 ≤ 2 z + 2 n n − f ≤ 2 0\leq \frac{2z + 2n}{n - f} \leq 2 0nf2z+2n2

− 1 ≤ 2 z + 2 n n − f − n − f n − f ≤ 1 -1\leq \frac{2z + 2n}{n - f} - \frac{n-f}{n-f}\leq 1 1nf2z+2nnfnf1

− 1 ≤ 2 z + n + f n − f ≤ 1 -1\leq \frac{2z + n + f}{n - f} \leq 1 1nf2z+n+f1

− 1 ≤ 2 z + n + f n − f ≤ 1 -1\leq \frac{2z + n + f}{n - f} \leq 1 1nf2z+n+f1

  • 化简为线性式,方便后面把式子化为矩阵

− 1 ≤ 2 z n − f + n + f n − f ≤ 1 -1\leq \frac{2z}{n - f} + \frac{n+f}{n-f} \leq 1 1nf2z+nfn+f1

6、化简Z坐标(DirectX下 [0,1])

在这里插入图片描述
因为我们观察空间是右手坐标系。但是,我们裁剪空间是左手坐标系。所以,这里需要化简的式子需要变化一下。(左手坐标系Z轴正方向与上图相反)

  • f ≤ z ≤ n f\leq z \leq n fzn 变为 − n ≤ z ≤ − f -n\leq z \leq -f nzf

− n ≤ z ≤ − f -n \leq z \leq -f nzf

0 ≤ z + n ≤ n − f 0 \leq z + n\leq n -f 0z+nnf

0 ≤ z + n 1 n − f ≤ 1 0 \leq z+n \frac{1}{n-f} \leq 1 0z+nnf11

0 ≤ z + n n − f ≤ 1 0 \leq \frac{z+n }{n-f} \leq 1 0nfz+n1

  • 化简为线性式,方便后面把式子化为矩阵

0 ≤ z n − f + n n − f ≤ 1 0 \leq \frac{z}{n-f} + \frac{n}{n-f}\leq 1 0nfz+nfn1


三、把转化后的坐标转化为矩阵

  • X
    − 1 ≤ 2 x w ≤ 1 -1 \leq \frac{2x}{w} \leq 1 1w2x1

  • Y
    − 1 ≤ 2 y h ≤ 1 -1\leq \frac{2y}{h}\leq 1 1h2y1

  • Z(OpenGL)
    − 1 ≤ 2 z n − f + n + f n − f ≤ 1 -1\leq \frac{2z}{n - f} + \frac{n+f}{n-f} \leq 1 1nf2z+nfn+f1

  • Z(DirectX)
    0 ≤ z n − f + n n − f ≤ 1 0 \leq \frac{z}{n-f} + \frac{n}{n-f}\leq 1 0nfz+nfn1

1、OpenGL下

[ 2 w 0 0 0 0 2 h 0 0 0 0 2 n − f n + f n − f 0 0 0 1 ] \begin{bmatrix} \frac{2}{w} & 0 & 0 & 0 \\ 0 & \frac{2}{h} & 0 &0\\ 0 & 0 & \frac{2}{n -f} &\frac{n + f}{n - f}\\ 0 & 0 & 0 & 1\\ \end{bmatrix} w20000h20000nf2000nfn+f1

2、DirectX

[ 2 w 0 0 0 0 2 h 0 0 0 0 1 n − f n n − f 0 0 0 1 ] \begin{bmatrix} \frac{2}{w} & 0 & 0 & 0 \\ 0 & \frac{2}{h} & 0 &0\\ 0 & 0 & \frac{1}{n -f} &\frac{n}{n - f}\\ 0 & 0 & 0 & 1\\ \end{bmatrix} w20000h20000nf1000nfn1

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

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

相关文章

Python 雨花 - 前言

众多技术教程的个人网站 https://wukongnotnull.com/ 目录 ⛳️ 教程介绍🎯 前置要求⚽️ 学习交流群🧭 教学文档配套视频🥎 一对一 VIP答疑辅导💡 参考文献 ⛳️ 教程介绍 Python 入门教程,通俗易懂,快速…

手滑误删备忘录?这样做手滑误删也能恢复

在这个快节奏的时代,备忘录几乎成了我日常生活的救命稻草。匆忙间,我时常依赖它记录那些一闪而过的灵感或是重要的待办事项。但你有没有过这样的经历?在滑动屏幕的一瞬间,一个不小心,重要的备忘录就这么消失了&#xf…

springboot+vue项目如何在linux上部署

在linux上部署项目,是我们实训项目作业的最后一步,此时我们的项目编码测试已经完成,接下来就需要在服务器上部署上线,那么如何部署上线,接下来我会在虚拟机上的CentOS7系统上实现部署, 一.下载JDK 因为我…

如何搭建一个高效的Python开发环境

“工欲善其事,必先利其器”,这里我们来搭建一套高效的 Python 开发环境,为后续的数据分析做准备。 关于高效作业,对于需要编写 Python 代码进行数据分析的工作而言,主要涉及两个方面。 1. 一款具备强大的自动完成和错…

c语言:计算阶乘的和|练习题

一、题目 输入一个数n,计算1!2!……n!的和 如图: 二、思路分析 设置两个函数 1、一个函数求阶乘 2、一个函数求多个数相加的总和 3、把求阶乘的函数,嵌套在求相加总和的函数里面 三、代码截图【带注释】 四…

highcharts的甘特图设置滚动时表头固定,让其他内容跟随滚动

效果图:最左侧的分类列是跟随甘特图滚动的,因为这一列如果需要自定义,比如表格的话可能会存在行合并的情况,这个时候甘特图是没有办法做的,然后甘特图的表头又需要做滚动时固定,所以设置了甘特图滚动时&…

【代码混淆】react-native 代码混淆

​ 使用react native开发app,实现代码混淆的操作。 无论是加密还是运行时虚拟机,最后都可以通过执行时调试把代码反向生成出来原来的代码,虽然能抵御低端的黑客攻击,但是对高端黑客却形同虚设。 代码混淆是通过修改源代码结构和变…

【习题】运行Hello World工程

判断题 1. DevEco Studio是开发HarmonyOS应用的一站式集成开发环境。 正确(True)错误(False) 正确(True) 2. main_pages.json存放页面page路径配置信息。 正确(True)错误(False) 正确(True) 单选题 1. 在stage模型中,下列配置文件属于AppScope文件夹的是&am…

视频专访 | 每日互动刘宇:AI不止GC,更有TA

当前,“百模大战”已进入拼落地、拼应用的下半场,给千行百业带来了降本增效的巨大机遇。聚焦到品牌营销领域,大模型给行业带来了哪些改变?企业如何利用大模型优化数字化营销手段、提升数字化营销效果,最终驱动品牌实现…

嵌入式——I2C原理代码结合(干货)看图易懂

学习目标 理解I2C通讯原理理解I2C通讯过程中的信号理解软件I2C实现过程理解硬件I2C的工作内容学习内容 I2C通讯规则 I2C总线包括两根信号线:SDA(串行数据线)和SCL(串行时钟线)。这两根信号线共用一个总线,因此在总线上可以连接多个设备。在I2C总线上,每个设备都有一个唯…

微服务注册与发现——Eureka

文章目录 Eureka使用引用配置启动类标记访问微服务注册微服务工程添加引用增加配置启动类增加注解启动服务注册 Eureka Server集群部署修改配置文件启动多个eureka实例微服务注册到多个eureka实例 为Eureka Server添加用户认证引入spring-security配置关闭security的csrf&#…

C练习——水仙花数

“水仙花数”是指一个三位数,其每位数字的立方和等于该数本身。 例如:153是一个“水仙花数”,因为1531的三次方+5的三次方+3的三次方。 // 打印 100 - 999 的所有水仙花数 // 利用for循环控制100 - 999个数&#xff…

Exploring the Limits of Masked Visual Representation Learning at Scale论文笔记

论文名称:EVA: Exploring the Limits of Masked Visual Representation Learning at Scale 发表时间:CVPR2023 作者及组织:北京人工智能研究院;华中科技大学;浙江大学;北京理工大学 GitHub:http…

从公务员转行网络安全工程师,铁饭碗也比不过“金饽饽”。

前言 随着疫情的不断变化,影响力席卷大多数的行业,许多人也在这次疫情中失去了工作,或是收入与之前相比大打折扣,因此越来越多的人涌入到了考公或考事业单位的大潮之中。 考公是一场与实力与运气的battle,不到上岸的…

MS2244模拟开关可Pin to Pin兼容NJM2244

MS2244 是一款集成的视频开关,实现三输入视频或音频信号的三选一。可Pin to Pin兼容NJM2244。 芯片集成了 75Ω驱动电路,可以直接驱动电视监控器。芯片工作电压 5V~12V,带宽 10MHz,抗串扰 70dB (4.43MHz)。另外芯片还集…

NC(65)元数据增加字段

以报销单主表er_bxzb表为例,增加15个字段字段以及两个其他业务所需字段 1、先在er_bxzb增加字段 增加字段 alter table er_bxzb add no_invoice char(1) default(N);alter table er_bxzb add is_enabled_taxation_cloud char(1) default(N);alter table er_bxzb a…

SANSAN新鲜事|场站数字化避“坑”指南

场站如何定义 场站是指在某个特定的区域内,为了完成某个特定的任务而建立的一个或多个设施的集合。常见的场站涉及各行各业,比如电力行业的变电站、开闭所、配电房等;再比如燃气行业的门站、调压站、加气站等; 另外,还…

Ansys Speos | 3D Texture 车灯案例应用

Speos 3D Texture功能提供了一种解决方案,可以绕过 CAD 系统限制来设计和模拟数百万个小图案:pattern图案的分布类型和重复次数。3D Texture可用于设计照明系统,例如光导、车灯、亮度增强膜 (BEF) 和由数百万个几何元素…

Jmeter的性能测试

性能测试的概念 定义:软件的性能是软件的一种非功能特性,它关注的不是软件是否能够完成特定的功能,而是在完成该功能时展示出来的及时性。 由定义可知性能关注的是软件的非功能特性,所以一般来说性能测试介入的时机是在功能测试…

UGUI Panel的显示和隐藏优化

unity UI如何开启(显示)或者关闭(隐藏)Panel界面,相信大家都是知道的,但是如何做最好呢? 可能大家一般开启/关闭界面的方法就是直接SetActive吧。这样做通常是可以的,简答快速地解决…