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

news2024/11/20 20:17:54

文章目录

  • 前言
  • 一、正交相机视图空间 转化到 裁剪空间 干了什么
    • 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为我们正交相机方盒子的宽,我们这里先假设为w。可以通过屏幕像素相除得到屏幕高宽比。然后,乘以h即可得到宽)

我们已知的是:
正交相机方盒子的高 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

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

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

相关文章

Ubuntu16.04下载安装藏文字体详细教程(附图)

Ubuntu16.04下安装藏文字体详细教程(附图) 你是不是也被ubuntu系统中藏文或者中文总是不显示且乱码的问题困扰呢,那么你可以看看我的解决方法。 在没有装藏文或中文字体前你在打开一个文本文件的时候是不是下面这样的 安装步骤 上传或下载若…

学习笔记13——Spring整合Mybatis、junit、AOP、事务

学习笔记系列开头惯例发布一些寻亲消息 链接:https://baobeihuijia.com/bbhj/ Mybatis - Spring(使用第三方包new一个对象bean) 原始的Mybatis与数据库交互【通过sqlmapconfig来配置和连接】 初始化SqlSessionFactory获得连接获取数据层接口…

人工智能_机器学习078_聚类算法_概念介绍_聚类升维_降维_各类聚类算法_有监督机器学习_无监督机器学习---人工智能工作笔记0118

首先看一下什么是聚类,我们可以进入sklearn的官网去看看 可以看到这里,首先classification 这个分类我们学完了,然后就是regression回归我们也学完了对吧,其实我们现实生活中的,大部分问题就是 这两种问题就可以解决了. 然后我们再来看一个: clustering,这个就是聚类对吧.聚类算…

【JVM】对象

一、对象的内存布局 以Hotspot虚拟机为例,对象在内存中的结构可以分为三部分:对象头(header)、实例数据(instance data)、对齐填充(padding)。 1.1.对象头 对象头的结构大体相似&…

LeetCode day31

LeetCode day31 被创新实践的机器学习大作业和数据库作业折磨力,临近期末,各种大作业以及ddl,搞的咱只能偶尔刷刷力扣,但是csdn就挺难去发布了,大家期末也好好复习过个好年啦,O(∩_∩)O 409. 最长回文串 给定一个包含…

Unity so文件的问题

文章目录 问题在面板上无法显示子节点如何保存继承于so的类必须放置在单个脚本so类文件名和类名要一致 问题 最近自己在写一个行为树出现一些问题记录一下首先NodeTree肯定是so文件但是node可以是单纯的类,也可以是so。后来我发现只能是so 在面板上无法显示 第一…

2024年大学计算机等级考试报名注意事项及照片处理方法

计算机等级考试(National Computer Rank Examination,简称NCRE)是由国家教育部主管,全国计算机技术与软件专业技术资格(水平)考试中心主办的全国性计算机技术与应用能力水平考试。该考试旨在评估和认证考生…

C++继承与派生——(3)公有继承的访问权限的变化

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 缺乏明确的目标,一生将庸庸…

利用Jmeter做接口测试(功能测试)全流程分析!

利用Jmeter做接口测试怎么做呢?过程真的是超级简单。 明白了原理以后,把零碎的知识点填充进去就可以了。所以在学习的过程中,不管学什么,我一直都强调的是要循序渐进,和明白原理和逻辑。这篇文章就来介绍一下如何利用…

中小工厂更适合什么样的自动仓储管理系统?

阅读本文你将了解中小工厂更适合什么样的自动仓储管理系统:一、确定自身规模;二、考虑功能配置;三、寻求拓展能力。 “我们工厂年产值3亿左右,算是个中小工厂吧,但是上了精细化的仓库管理系统之后,为了适应…

工具系列:TimeGPT_(2)使用外生变量时间序列预测

文章目录 TimeGPT使用外生变量时间序列预测导入相关工具包预测欧美国家次日电力价格案例 TimeGPT使用外生变量时间序列预测 外生变量在时间序列预测中非常重要,因为它们提供了可能影响预测的额外信息。这些变量可以包括假日标记、营销支出、天气数据或与你正在预测…

一个卖美妆的 一个月招了数十万代理!月销售额破亿 你敢相信吗?

商业模式永不过时 大家好,我是吴军,一家软件公司的产品经理 今天我们来聊一下这个纪炫商城 其实,说这个纪炫商城之前,我想跟各位企业家老板聊几句实在话 作为公司两百多号技术的,一个拥有五年软件开发经验的产品经理…

Michael.W基于Foundry精读Openzeppelin第45期——ERC20FlashMint.sol

Michael.W基于Foundry精读Openzeppelin第45期——ERC20FlashMint.sol 0. 版本0.1 ERC20FlashMint.sol 1. 目标合约2. 代码精读2.1 maxFlashLoan(address token)2.2 flashFee(address token, uint256 amount)2.3 flashLoan(IERC3156FlashBorrower receiver, address token, uint…

vue2中自定义右击菜单--vue-contextmenujs

第一步我们先安装这个依赖 npm install vue-contextmenujs 第二步把我们的依赖引入到全局中 import Contextmenu from vue-contextmenujs; Vue.use(Contextmenu) 第三步在我们需要右击菜单的代码上增加如下代码 第四步在方法中写入方法 当然其中还是有很多别的属性&#x…

Java web班级管理系统jsp【班级管理系统】(Java毕业设计)

大家好,我是DeBug,很高兴你能来阅读!作为一名热爱编程的程序员,我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里,我将会结合实际项目经验,分享编程技巧、最佳实践以及解决问题的方法。无论你是…

【华为机试】2023年真题B卷(python)-发广播

一、题目 题目描述: 某地有N个广播站,站点之间有些有连接,有些没有。有连接的站点在接受到广播后会互相发送。 给定一个N*N的二维数组matrix,数组的元素都是字符’0’或者’1’。 matrix[i][j]‘1’,则代表i和j站点之间有连接,mat…

项目零散记录

Ts托管 仅本项目禁用本地vscode内置的ts服务 提交代码前的检查 husky(哈士奇)工具(是一个git hooks工具) 1、安装 pnpm dlx husky-init && pnpm install安装的时候,出现如下报错 解决方案,需要先执行git init初始化…

【QML-布局】

QML编程指南 VX:hao541022348 ■ 布局■ Manual Positioning 手动定位■ Anchors 锚定位■ Positioners 定位器■ Row(行定位器)■ Column (列定位器)■ Grid(表格定位器)■ Flow(流…

打印各种形状

package org.example;public class Demo {public static void main(String[] args) {//打印长方形printDemo1();//打印有1定空隙的长方形printDemo2();//平行四边形printDemo3();//三角形printDemo4();//菱形printDemo5();//空心菱形printDemo6();}private static void printDe…

【JVM】垃圾回收理论

一、关于回收目标 在前面我们已经了解到,JVM的内存模型划分为多个区域,由于不同区域的实现机制以及功能不同,那么各自的回收目标也不同。一般来说,内存回收主要涉及以下三个区域: 虚拟机栈/本地方法栈:顾名…