从depth buffer中构建view-space position
观察透视投影矩阵:
对于x和y,矩阵变换只是一个缩放系数,那么逆变换就是缩放系数的倒数,所以
设Xndc Yndc为NDC空间中的XY坐标,Xview Yview Zview为view space中的坐标,则
所以
所以已知XY的NDC坐标和view space z,就能求出view space position,写成代码就是:
float M = tan(fov*0.5f)*aspect;
float N = tan(fov*0.5f);
float3 GetViewSpacePos(float2 NDCPos, float ViewSpaceZ)
{
float3 VPos = float3(NDCPos.xy, .f) * float3(M, N, .f);
return VPos * ViewSpaceZ;
}
如果depth buffer中已经存储了线性的view space depth,那么只需采样出depth,然后计算出position即可;如果depth buffer中储存的是非线性的perspective z(NDC z),那么需要先把perspective z逆变换为view space z,再使用上述方法计算position。
把perspective z变换为view space z:
对于view space z,乘以投影矩阵然后除以w得到ndc z:
由上式可得:
其中
写成代码就是:
float P0 = /zn;
float Q = zf/(zf - zn);
float P1 = /(zn*Q); float PerpectiveZToLinearZ(float Zndc)
{
return .f / (P0 - P1 * Zndc);
}
所以对于perspective z,构建view-space postion的代码如下:
float3 GetViewSpacePos_NDCZ(float2 NDCPos, float Zndc)
{
float ViewSpaceZ = PerspectiveZToLinearZ(Zndc);
return GetViewSpacePos(NDCPos, ViewSpaceZ);
}
从depth buffer中构建view-space position的更多相关文章
- 测试不同格式下depth buffer的精度
这篇文章主要是参考MJP的“Attack of The Depth Buffer”,测试不同格式下depth buffer的精度. 测试的depth buffer包含两类: 一是非线性的depth b ...
- [Zz] DX depth buffer
声明:本文完全翻译自DX SDK Documentation depth buffer,通常被称为z-buffer或者w-buffer,是设备的一个属性,用来存储深度信息,被D3D使用.当D3D渲染一 ...
- D3D depth buffer的预览
在使用D3D开发游戏的过程中,很多情况下都会用到depth buffer来完成特定的效果,比如DOF,Shadows,SSAO等等.在这些情况下我们就可能需要预览depth buffer来确定它是正确 ...
- java.nio.Buffer 中的 flip()方法
在Java NIO编程中,对缓冲区操作常常需要使用 java.nio.Buffer中的 flip()方法. Buffer 中的 flip() 方法涉及到 Buffer 中的capacity.posi ...
- Cesium 中由 Logarithmic Depth Buffer 引起的模型显示不完整的问题
当 Cesium 单个模型过长时,会遇到某些视角模型显示不完整的问题,如下图所示: 经过在官方论坛上询问,该问题由 viewer.scene.logarithmicDepthBuffer 开启造成,关 ...
- C#调用接口注意要点 socket,模拟服务器、客户端通信 在ASP.NET Core中构建路由的5种方法
C#调用接口注意要点 在用C#调用接口的时候,遇到需要通过调用登录接口才能调用其他的接口,因为在其他的接口需要在登录的状态下保存Cookie值才能有权限调用, 所以首先需要通过调用登录接口来保存c ...
- 如何在Android的ListView中构建CheckBox和RadioButton列表(支持单选和多选的投票项目示例)
引言 我们在android的APP开发中有时候会碰到提供一个选项列表供用户选择的需求,如在投票类型的项目中,我们提供一些主题给用户选择,每个主题有若干选项,用户对这些主题的选项进行选择,然后提交. 本 ...
- Depth Buffer
Up until now there is only one type of output buffer you've made use of, the color buffer. This chap ...
- 如何在低api中使用View的属性设置方法如setAlpha等
ViewPagerTransforms 是一个自定义了各种翻转效果的开源库,其中的各种PageTransformer使用了view的很多属性设置方法如DepthPageTransformer中:? p ...
随机推荐
- js与php传递参数
这个问题在网页开发时经常遇到,其实解决办法非常简单,就是几行代码的事,不过各种js.php书上都没有,百度下来也乱七八糟的,有的能用,有的不能用.小编遇到这问题时认认真真研究了一上午,研究出一点心得, ...
- redhat6 + 11G DG部署
在主库中netca配置 [oracle@HE3dbs]$ cat /u01/app/oracle/product/11gr2/db_1/network/admin/listener.ora #list ...
- 实例:基于ListActivity实现列表
如果程序的窗口仅仅需要显示一个列表,则可以直接让Activity继承ListActivity来实现,ListActivity的子类无须调用setContentView()方法来显示某个界面,而是可以直 ...
- C# 启动停止SQLServer数据库服务器
C#启动停止SQL数据库服务方法之一: 在命令行里填写命令:net start/stop mssqlserver C#启动停止SQL数据库服务方法之二: 通过C#代码实现: class Program ...
- 2016年,总结篇 之 VueJS 如何入门(一)
接着 2016 年的总结,我们来看看 2016年 国内最火且没有之一的前端MVVM 框架 VueJs 虽然 到写文章的这个时间点,VueJs已经发布了 2.1.x 了, 但是对于很多 Vuejs 的初 ...
- jq返回顶部
今天发工资了,哎,更加坚定我要努力的学习,没资本,只能玩技术了.人呢,想的的开,才行,虽然有些不甘心,不过确实,现在的技术只值这个 价格.不过做到问心无愧就够了,不然人之贪婪,真的收也收不回.好了,今 ...
- 搭建typescript开发环境最详细的全过程
搭建typescript开发示例https://github.com/Microsoft/TypeScriptSamples typescript案例https://www.tslang.cn/sam ...
- 2017年试试Web组件化框架Omi
Open and modern framework for building user interfaces. Omi的Github地址https://github.com/AlloyTeam/omi ...
- vue1.0学习总结
前言 使用vue已经有三.四个月了,但是只是学着使用了一些基本方法.因为现在的前端框架越来越多(Angular,React...),但是我相信万变不离其宗,很多用法框架之间还是想通的,所以借总结的vu ...
- JavaScript易混淆知识点小回顾--数组方法与字符串方法;
数组属性: arr.length;查看数组的长度 arr.Pop;删除数组最后一个元素; 数组的方法: arr.push();添加到数组末端; arr.shift();删除数组的第一个元素; arr. ...