Reconstructing Position From Depth

2024-06-21 11:32

本文主要是介绍Reconstructing Position From Depth,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

需求: 根据当前像素的Depth计算出其View空间的Position

先说一种惯性思维的方法: 既然知道depth是怎么算出来的, 那么进行逆运算回去不就得到position了?

先说说depth是怎么出来的:

Vertex shader:

output.position = mul(input.postion, matWorldViewProject);

output.depth.xy = output.position.zw;

Pixel shader(输出z/w):

return input.depth.x / input.depth.y;

那么, 逆运算回去就很直接了(input.uv是全屏矩形的纹理坐标):

float z = tex2D(DepthSampler, input.uv);

// transform to projection space

float x = input.uv.x * 2 - 1;

float y = (1 - input.uv.y) * 2 - 1;

float4 vProjectedPos = float4(x, y, z, 1);

// transform to view space 

float4 vPosition = mul(vProjectedPos , matInvProject);

return (vPosition.xyz / vPosition.w);

那么这样做有什么缺点呢?

l z/w是非线性分布的, 经过RTT后再变换回去会有精度上的损失

l 计算量有点大, 要知道PS里的每个指令都是很宝贵的.

下面说说另一种非常快的算法, 而且也可以解决精度问题. 先看看摄像机视锥体的抽象形式:

从摄像机位置到远裁剪面发射一条射线, 那么, 对于可见的任意一点, 有这么个关系:

vPositionView = vViewRayDir * fLinearDepth;

其中, fLinearDepth代表规格化的Z, 它是线性分布的, 即:

fLinearDepth = vPositionView.z / fFarClipDist;

剩下的, 就是这个屏幕射线vViewRayDir从哪来的问题了.

我们知道, 在View空间, 摄像机位置是(0, 0, 0). 那么, 对于每条射线的方向, 等价于射线与远裁剪面的交点坐标. 即:

vViewRayDir = float3(fFarClipX, fFarClipY, fFarClipDist);

远裁剪面上的4个顶点坐标我们是可以算出来的, 就是Frustum中的四个顶点. 如果我们把这四个顶点坐标写入全屏矩形的顶点坐标中, 然后在VS中输出, 那么在PS中得到的就是已经插值好的射线方向了!

整理一下整个思路:

1. 把vPositionView.z / fFarClipDist输出到RTT, 这里因为是线性分布的, 在精度允许的前提下可以进行压缩

2. 从RTT里得到fLinearDepth, 从VS_OUTPUT出的寄存器里得到已经插值好的vViewRayDir.xy, vViewRayDir.z就是fFarClipDist, Position的重建只需要一句计算就可以得到:

vPositionView = vViewRayDir * fLinearDepth;

Reference(要翻墙): http://mynameismjp.wordpress.com/2009/03/10/reconstructing-position-from-depth/


原文: http://blog.csdn.net/xoyojank/article/details/5294575

这篇关于Reconstructing Position From Depth的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1081109

相关文章

【CSS in Depth 2 精译_023】第四章概述 + 4.1 Flexbox 布局的基本原理

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结) 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位(已完结) 2.1 相对单位的威力2.2 em 与 rem2.3 告别像素思维2.4 视口的相对单位2.5 无单位的数值与行高2.6 自定义属性2.7 本章小结 第三章 文档流与盒模型(已

【CSS in Depth 2 精译_024】4.2 弹性子元素的大小

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结) 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位(已完结) 2.1 相对单位的威力2.2 em 与 rem2.3 告别像素思维2.4 视口的相对单位2.5 无单位的数值与行高2.6 自定义属性2.7 本章小结 第三章 文档流与盒模型(已

css-transform对position:fixed影响

在betterScroll尝试使用position:fixed固定首列,然而并不能实现固定。因为 bscroll / iscroll 是基于 transform 属性实现滚动的, 所以 iscroll 会通过实时修改元素的 transform 属性以达到滚动的效果。父元素如果存在 transform 属性,子元素的 position: fixed 属性无效。betterScroll有个 useTr

【python 编码问题】UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not

插入oracle 数据发生 错误:UnicodeEncodeError: 'ascii' codec can't encode characters in position 131-136: ordinal not in range(128) 先说解决办法: python2.7版本,在开头加入下面语句 import sysreload(sys)sys.setdefaultencoding

Unexpected token d in JSON at position 5, check bodyParser config错误解决

错误原因:json格式不对 { desc="设备1", iotProjectId=11 } 解决:通过json在线校验格式校验json格式,找出错误原因,修改 在线JSON校验格式化工具(Be JSON) 修改: {"desc": "设备","iotProjectId": 11}

jQuery 获取元素位置 offset() 和 position()

本篇文件向大家介绍的方法是 offset() 和 position() ,这两个方法有什么关系?下面的内容做详细介绍。 offset()功能描述:在匹配的元素集合中,获取的第一个元素的当前坐标,坐标相对于文档。 position() 功能描述:获取匹配元素中第一个元素的当前坐标,相对于offset parent的坐标。( 注:offset parent指离该元素最近的而且被定位过的祖先元素 )

Matlab_learning_1(set(gcf,'MenuBar','none','Position',[X,Y,Z,W]))

一、首先举个例程: set(gcf,'MenuBar','none','Position',[X,Y,Z,W]);

配置aop报错: Pointcut is not well-formed: expecting 'name pattern' at character position

切入点表达式的使用规则: execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?) 有“?”号的部分表示可省略的,modifers-pattern表示修饰符如public、protected等,ret-type-patter

Last Position of Target

Find the last position of a target number in a sorted array. Return -1 if target does not exist. Example Example 1: Input: nums = [1,2,2,4,5,5], target = 2Output: 2 Example 2: Input: nums = [1,

Maximum Depth of N-ary Tree

Input: root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]Output: 5 思路1:DFS ,divide and conquer /*// Definition for a Node.class Node {public int v