最近在Unity在ForwardPath的情况下,实现一个DeferRender的效果。 其中在DeferRender的时候会用到世界坐标。 世界坐标有三个值x,y,z,如果要记录三个值就需要三个通道来记录世界坐标。
第一部分:根据深度值世界坐标
其实在DeferRender的时候我们对每一个像素值都是可以知道屏幕坐标的xy值的, 那么只要知道了深度值, 就可以反向推出世界坐标了。
图1-1 模型空间到屏幕空间的过程
在经过透视除法得到的结果xyz 都是在-1 -- 1 (opengl) 或者0-1(directx)。 我们只要获取到这个深度值。 在PC中, vertex的 shader写法如下:
图1-2 在vertshader中获取深度值
记录的深度值就可以在后处理过程当中使用了。 当然可以通过另外一种方法获取深度值就是设置Camera的depthTextureMode 为depth 或者depthnormal。 这样在shader中只要做如下声明就可以获得深度贴图了。
图1-3 在sheder中声明 _CameraDepthTexture
现在已经可以获得深度值了。 如何构建屏幕空间的坐标呢? 拿到屏幕上的坐标,组合深度值就是了。我们在使用Graphics.Blit的时候UV值就是 屏幕空间的归一化坐标了。
现在只要获得两个矩阵就可以获得世界坐标。 一个是投影矩阵MatriProjection, 一个是MatrixWToV。 求出这两个矩阵的逆矩阵就可以轻松通过矩阵成向量获得世界坐标。
图1-4 根据屏幕坐标和深度值求世界坐标
图1-4中 有个矩阵_ViewProjectionInverseMatrix 是投影矩阵和世界坐标转观察空间矩阵相乘求逆得到的。通过Material.setMatrix设置的。
图1-5 在PreRender中设置_ViewProjectionInverseMatrix
第二部分:如何测试你的结果是否正确
在Shader中如何测试我们计算的结果是多少,或者是否正确? 有几种方式都可以测试。 一种是使用帧调试器, 在调试的过程当中可以清楚的看到Shader计算的值。不论是参数还是计算结果。 Unity5已经自带帧调试器了。 而Unity5以前的版本 则可以使用IntelGPA, 高通的AdrenoProfiler 打出一个exe的包用Visual Studio的帧调试器。 当然还有其他一些工具。
另外一种方式则是直接输出颜色值, 把你的值压缩在0-1范围内。这里可以直接使用第二种方法。因为我们在正常的渲染情况下渲染一遍物体,把深度值渲染到一张RenderTexture上,然后在后处理中反推出世界坐标。 那么只要我们把世界坐标的值压缩在0-1赋值给这个物体的颜色即可。 然后在后处理中同样把计算的世界坐标压缩到0-1直接。 只要编辑器下Scene里的物体颜色和Game里的物体颜色一致,结果就对了。否则就是错的。
图2-1 在渲染物体的输出世界坐标坐标作为颜色值
图2-2 后处理中计算的直接坐标值和实际的世界坐标值一致的结果
在实际测试过程当中,会出现物体拖得太远在camera里就看不见了, 这是因为z-fighting的原因, 我们计算出来的z值和原坐标的z并非是线性关系,而是一条曲线值。 在某些地方就会出现精度问题。 z-fighting可以阅读文章:https://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orthographic-projection-matrix/opengl-perspective-projection-matrix
第三部分:仍然有疑问的地方
1、回到图1-1当中, 在透视除法之后理论上xyz的值都应该是-1--1 或者0-1。 而我使用的是OpenGL的做法即 -1---1。 但我在图1-2中取深度值直接取
z = o.position.z / o.postion.w
而不是
z =( o.position.z / o.postion.w + 1 ) * 0.5
测试也是前哪一种方法是对的, 而后一种方法是错的。
2、我是否可以观察空间下的z 除以 farplane的值就可以了。 因为如果z超过了farplane 就被裁剪掉了。 然后在后处理过程当中直接拿到view空间下的坐标替换z值,然后乘上 UNITY_MATRIX_MV 的逆矩阵 和 _Object2World 就可以得到世界坐标了呢?
3、在实际的不同平台上裁剪空间上区别还没有验证。
附件是我在Unity4.6下测试代码, 在unity5中会报错,只要修改其中的GenerateDepthAndShowWoldPos.shader即可运行了。
参考:
1、https://forum.unity3d.com/threads/reconstructing-world-pos-from-depth-imprecision.228936/
2、http://www.klayge.org/2011/01/16/klayge%e4%b8%ad%e7%9a%84%e5%bb%b6%e8%bf%9f%e6%b8%b2%e6%9f%93%ef%bc%88%e4%ba%8c%ef%bc%89/

Unity根据深度值计算世界坐标相关推荐

  1. 深度缓冲中的深度值计算及可视化

    概述 在渲染管线中的顶点变换中,介绍了顶点在各个坐标空间的变换.变换到最后,是屏幕坐标空间.在OpenGL中,屏幕空间坐标的Z值即是深度缓冲中的深度值.深度缓冲包含了一个介于0.0和1.0之间的深度值 ...

  2. R语言用户自定义函数的语法结构、编写自定义统计值计算函数(使用ifelse结构计算均值和标准差等)、编写自定义日期格式化(format)函数(switch函数使用不同分枝格式化日期数据)、应用自定函数

    R语言用户自定义函数的语法结构.编写自定义统计值计算函数(使用ifelse结构计算均值和标准差等).编写自定义日期格式化(format)函数(switch函数使用不同分枝格式化日期数据).应用自定函数 ...

  3. 【数据结构】哈希表、哈希值计算分析

    哈希表.哈希值计算分析 哈希表完整代码 引出哈希表 哈希表(Hash Table) 哈希冲突(Hash Collision) JDK1.8的哈希冲突解决方案 哈希函数 如何生成 key 的哈希值 In ...

  4. 项目管理之项目的挣值计算问题

    本文将通过详细讲解历年的四道挣值计算真题来帮助掌握项目管理中的挣值计算问题. 项目管理专业术语与计算公式汇总 真题一:挣值计算(2010.11) 真题二:进度与挣值计算(2012.05) 真题三:进度 ...

  5. java中计算器算cos值,Android开发中计算器的sin、cos及tan值计算问题分析

    本文实例讲述了Android开发中计算器的sin.cos及tan值计算问题.分享给大家供大家参考,具体如下: 接到一个需求 :要求计算器sin90=1,拿到知道很疑问 难道不等于一么?测试了四五个手机 ...

  6. 大唐无双零武将经验计算机,大唐无双武将初始值计算加守护计算选择技能分享...

    大唐无双武将初始值计算加守护计算选择技能分享 很多小伙伴刚玩大唐无双,不清楚武将怎么养成.下面小编就为大家带来了大唐无双武将初始值计算加守护计算选择技能分享,有需要的小伙伴一起来看看吧. BB属性如上 ...

  7. python 编写函数,实现根据键盘输入的长、宽、高之值计算长方体体积

    编写函数,实现根据键盘输入的长.宽.高之值计算长方体体积 n1 = input("长:") n2 = input("宽:") m =input("高: ...

  8. p 值计算(置信度)

    一.p值的概念 参考 [科研新手必学]手把手教你统计学的P值含义和检验假设 下图中,μ0 表示整个地区的总体均值,μ 表示整个矿区的整体均值, X ‾ \overline{X} X 表示矿区抽样的均值 ...

  9. Unity 使用 GPU 計算,使用 ComputeShader + ComputeBuffer

    如果你會看這篇文章,代表你玩 Unity 已經玩到很深入了,CPU 計算已經不能滿足你,這時你不得不把注意力轉到 GPU 身上.GPU 的介紹就不用我多說了,就是超越CPU的存在.如果用 Textur ...

最新文章

  1. mysql8.0取消授权_mysql8创建用户、删除用户、授权、取消授权
  2. php curl_multi_close,PHP curl_multi_close函数
  3. 请分别介绍一下aof和rdb都有哪些优点?以及两者有何区别?
  4. LeetCode训练
  5. 移动app测试的多样性_快速搞定APP移动端自动化测试
  6. 面试官:如何实现幂等性校验?
  7. Ado.Net读取Excel常见问题总结
  8. Testng 的数据源 驱动測试 代码与配置
  9. nvidia 卸载驱动
  10. 轻松容易记住外贸出口全流程,适用于外贸新手最佳
  11. csv格式导出,身份证号码显示不全
  12. 深度学习:行为识别综述
  13. 电脑无故关机,出现提示:从异常关机中恢复 bluescreen.........
  14. 【问题解决】Selenium——NoSuchWindowException: Browsing context has been discarded
  15. Java计算平均成绩
  16. JavaFX鼠标移入后改变样式
  17. 计算机数据压缩说课,第3章多媒体数据压缩.ppt
  18. 干货 | 查资料利器:线上图书馆
  19. 江阴市计算机等级考试报名,计算机二级考试技巧【江阴计算机二级培训】
  20. 基因表达分析(上)- 差异表达分析

热门文章

  1. 滚球游戏(动态规划)
  2. 高品质的音乐蓝牙耳机有哪些推荐?音质好的蓝牙耳机排行榜
  3. 菜鸟必看:wndows xp进程全解
  4. FPGA BPI FLSAH远程升级Quick boot
  5. 手机扫码登录电脑QQ出现无法登录问题
  6. php shm,PHP shm_put_var()访问已释放资源漏洞
  7. 【面经】2023年软件测试面试题大全(持续更新)附答案
  8. 编程类语言学习必备英文单词 NO.1 ----持续分享
  9. Mac隐藏显示隐藏文件方法
  10. Html 空格与换行