Perspective Devision

简介:

本文以OpenGL为例:

OpenGL的Projection矩阵为:

[

n/r, 0, 0, 0,

0, n/t, 0, 0,

0, 0, -(f+n)/(f-n), -2fn/(f-n),

0, 0, -1, 0

]

其中f为far,n为near。着重看z和w分量,xy就不解释了。

设z为view 变换后,camera space的深度值。那么乘以projection矩阵以后,

z' = -(f+n)/(f-n) * z - 2fn/(f-n)

w' = -z

这个时候,z‘的值并不在[-1,1]的范围内(x,y也不在这个范围)。因此,clip space的值域并非为[-1,-1]的一个cube。但是距离这个已经很接近了。 Perspective devision的意思是,clip space的x‘y'z'w‘同时除以w’,此时得到的x'',y'',z''才在[-1,1]的范围内。

这时:

z'' = (f+n)/(f-n) + 2fn/z*(f-n)

w'' = 1

此时的坐标称为NDC(Normalized Device Coordinates)。

所以,我们在VS中把坐标乘以MVP以后得到的值,是位于clip space中,而不是NDC,因此此时的w分量还是有意义的,并不能略去。glPosition也是一个vec4的类型,而不是vec3。clip space转换到NDC的这个perspective devision过程是由硬件做的,在裁剪之前完成。

顺便解释一下如何将depth texture中的z值转换成线性的z值。

首先,depth texture中的z值,值域为[0,1],是NDC,而不是在clip space中。

通常Linear01Depth = 1.0 / (_ZBufferParams.x * z + _ZBufferParams.y);

其中:

_ZBufferParams.x = (1.0 - far/ near) / 2.0;
_ZBufferParams.y = (1.0 + far/ near) / 2.0;

将带入上述公式:

Linear01Depth = z/f, 即为[0,1]范围内的线性深度。上述算法和Unity中的Linear01Depth函数是一致的。

相关文章
CSS3 perspective 透视
CSS3 perspective 透视
94 0
|
前端开发
线性渐变背景 CSS linear-gradient() 函数 background-image: linear-gradient()
线性渐变背景 CSS linear-gradient() 函数 background-image: linear-gradient()
125 0
线性渐变背景 CSS linear-gradient() 函数 background-image: linear-gradient()
transform: translateY(-50%)实现垂直居中效果
transform: translateY(-50%)实现垂直居中效果
145 0
transform: translateY(-50%)实现垂直居中效果
|
算法 数据可视化 C++
OpenCASCADE Outline
OpenCASCADE Outline eryar@163.com      有网友反映blog中关于OpenCASCADE的文章比较杂乱,不太好找,最好能提供一个大纲,这样方便查找。于是决定将这些学习时写的文章整理下,方便对OpenCASCADE的学习理解。
3064 0
|
资源调度 芯片
流片Corner Wafer介绍
本文介绍 流片Corner Wafer介绍
2253 0
流片Corner Wafer介绍
|
前端开发
CSS:linear-gradient()背景颜色线性渐变
CSS:linear-gradient()背景颜色线性渐变
193 0
|
Web App开发
CSS3D之 perspective、perspective-origin属性
perspective、perspective-origin属性含义及常见用法介绍
1539 0
第101天:CSS3中transform-style和perspective
一、transform-style 1、transform-style属性是3D空间一个重要属性,指定嵌套元素如何在3D空间中呈现。 有两个属性值:flat和preserve-3d。 transform-style属性的使用语法非常简单: transform-style: flat | preserve-3d 其中flat值为默认值,表示所有子元素在2D平面呈现。
1013 0
|
JavaScript
第99天:CSS3中透视perspective
CSS3中透视perspective 透视原理: 近大远小 。 浏览器透视:把近大远小的所有图像,透视在屏幕上。 理解浏览器的坐标系:浏览器平面为 Z=0的平面,坐标原点默认为图片的中心,可以通过更改透视原点进行更改。
1170 0