重建世界坐标

1.概论

在屏幕空间做一些操作的时候往往需要从屏幕坐标和深度纹理中重建出相应的世界坐标。
本文会讨论两种重建世界坐标的方法,并详细讲解第二种方法。

  1. 使用VP逆矩阵
  2. CameraPosInWorld + linearDepth * Direction

2.使用VP逆矩阵法

我们知道屏幕坐标是通过Object Space下的坐标与MVP矩阵相乘,经历透视除法,再映射到0-1区间下得到相应的屏幕坐标。
经历这些操作之后,xy就是相应的屏幕坐标,而z会被用来进行深度测试比较。
这里我们省略再拉伸到屏幕像素大小的过程。

注意!!!在OpenGL中深度被映射到[-1,1], DX中深度被映射到[0,1]区间

那么我们从深度图中可以得到缺失的深度,再加上我们已知屏幕坐标,是不是进行一遍逆操作就可以得到相应的世界坐标了呢?Yes!
那么我们来分析一下这种操作的优缺点吧!

优点 : 简单 简单 简单
缺点 : 假如我们需要对每个像素进行世界坐标的重建,那么我们就要进行屏幕分辨率乘以一个4x4Matrix的矩阵乘法的操作!!!

这明显不好,尤其是在GPU中进行多次矩阵乘法,很耗时!
那么我们来看看第二种方法。

3.CameraPosInWorld + linearDepth * Direction

让我们来分析一下这个公式的每个变量的含义!

CameraPosInWorld:很简单,就是摄像机在世界空间下的坐标位置。

linearDepth:代表每个像素的世界坐标在View Space下的深度,也就是视口空间下的像素坐标的Z值。

Direction: 方向,代表起点为摄像机,终点为近平面的四个角的一个向量。

在这里插入图片描述
这幅图很形象的描述了我们所需的四个方向,或者说向量。
那么我们该怎么计算呢?

  1. 首先我们需要计算toToptoRight两个向量,这里我们一定可以拿到摄像机的FOV角度(竖直方向的视角距离),aspect代表摄像机的宽高比。
    在这里插入图片描述

  2. 那么我们进行一下简单的向量操作就可以得到我们想要的四个向量。
    在这里插入图片描述
    记住,toTop和toRight的起点还是在摄像机。
    在这里插入图片描述

  3. 我们从深度图中拿到的是z值坐标,并不是从摄像机出发,沿着TL,TR,BL,BR等方向的一个深度,而是一个垂直距离,那么我们就要做一个映射,从depth,映射到我们想要的深度。
    在这里插入图片描述
    想必大家一眼就看出来了(这里以TL为例):
    在这里插入图片描述
    那么我们的表达式就变成了:
    在这里插入图片描述
    这里我们假设:
    在这里插入图片描述
    那么我们就可以在CUP中将scale与direction相乘,这里的scale对于四个方向来说都是一样的,所以并不影响我们后面的在GPU中的插值。

  4. 最终
    在这里插入图片描述
    那么我们传入顶点着色器,我们可以根据像素的位置来判断需要使用哪个方向,并由GPU进行插值,来得到我们所对应需要的方向,并在片段着色器中重建世界坐标。

以Unity Shader为例:

                int index = 0;if (v.vertex.x < 0.5 && v.vertex.y < 0.5) {index = 0;}else if (v.vertex.x > 0.5 && v.vertex.y < 0.5) {index = 1;}else if (v.vertex.x > 0.5 && v.vertex.y > 0.5) {index = 2;}else {index = 3;}#if UNITY_UV_STARTS_AT_TOPif (_MainTex_TexelSize.y < 0)index = 3 - index;
#endif

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

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

相关文章

GPU Gems1 - 16 次表面散射的实时近似(Real-Time Approximations to Subsurface Scattering)

这一章&#xff0c;浅墨这篇文章介绍的非常详细&#xff0c;我照扒一遍再稍加一些内容&#xff0c;增加记忆。https://zhuanlan.zhihu.com/p/36499291 【章节概览】 次表面散射&#xff08;Subsurface Scattering&#xff09;&#xff0c;简称SSS&#xff0c;或3S&#xff0c…

Unity HDRP渲染管线基础指南

HDRP和LWRP简介 Unity2018中引入了可编程渲染管线&#xff08;Scriptable Render Pipeline&#xff0c;简称SRP&#xff09;&#xff0c;是一种在Unity中通过C#脚本配置和执行渲染的方式。至2018.1版本&#xff0c;Unity中除了默认渲染管线&#xff0c;还提供了轻量级渲染管线…

SSDO AO 图像空间的动态全局光照

本文仅记述SSDO学习笔记&#xff01; 概述 SSDO Screen-space Direction Occlusion 是对AO的扩充&#xff0c;在AO的基础上&#xff0c;假设没有遮蔽的方向有直接入射光&#xff0c;有遮蔽的方向&#xff0c;可能有间接光的反射。 SSAO理论分析 AO&#xff1a;在计算点的周围…

GPU Gems1 - 17 环境遮挡

环境光遮蔽&#xff08;Ambient Occlusion&#xff09;“AO”为Amblent Occlusion的缩写&#xff0c;中文译为环境光遮蔽。在DirectX 10.1 API推出后&#xff0c;Amblent Occlusion升级为SSAO&#xff08;Screen-Space Ambient Occlusion:屏幕空间环境光遮蔽&#xff09;&#…

GPU Gems1 - 18 空间BRDF(Spatial BRDFs)

这章主要介绍了空间双向反射分布函数&#xff08;SBRDF&#xff09;&#xff0c;接着文章讨论了压缩SBRDF表达式&#xff0c;以及由离散光或环境贴图所照明的SBRDF的渲染方法。关于BRDF请参考大佬浅墨的这篇文章https://blog.csdn.net/poem_qianmo/article/details/75943714 S…

浅谈表面反射——波动光学篇

Radiometric Definitions 首先让我们来回忆一下辐射度量学中关于irradiance和radiance的定义&#xff1a; 我们在这里定义光源(source)在x-z平面&#xff0c;因此入射光就可以只用θi\theta_{i}θi​来描述。dAs\mathrm{d}A_{s}dAs​是表面积。定义dΦi\mathrm{d}\Phi_{i}dΦ…

GPU Gems1 - 19 基于图像的光照(Image-Based Lighting)

这篇文章打破了当时立方体贴图环境&#xff08;Cube-Map Environment&#xff09;用法的桎梏&#xff0c;深入研究了更多可能的逼真光照效果。文章主要研究了基于图像的光照&#xff08;Image-Based Lighting&#xff0c;IBL&#xff09;&#xff0c;包括局部化的立方体映射&am…

Polygonal-Light Shading with LTC

概述 如果我们有一个上半球的余弦分布函数(Do)(D_{o})(Do​)&#xff0c;并对这个余弦分布函数进行一个矩阵(M)(M)(M)变换&#xff0c;变换为一个新的分布函数(D)(D)(D)。 DMDoD M D_{o}DMDo​ 这就是基本思想&#xff1a;用一个余弦分布函数来拟合出不同的分布函数&#xff…

GPU Gems1 - 20 纹理爆炸(Texture Bombing)

【章节概览】 这章介绍了纹理爆炸&#xff08;Texture Bombing&#xff09;和相关的细胞技术&#xff0c;它们能在Shader中增加视觉的丰富性&#xff0c;图像的多样性&#xff0c;并减少大块纹理图案的重复性。 【核心要点】 纹理爆炸&#xff08;Texture bombing&#xff0…

Catlike Coding网站文章解析 -- 1.Procedural Grid

原文英文版链接https://catlikecoding.com/unity/tutorials/procedural-grid/&#xff0c;里面有每一部分的untiy工程链接&#xff0c;文章内容也更详实。 本章内容&#xff1a; 创建一系列点使用协程实现他们的摆放位置定义一个由三角形组成的平面自动生成法线添加纹理坐标和…

GPU Gems1 - 21 实时辉光(Real-Time Glow)

这章浅墨的文章讲的很细了&#xff0c;这里基本照扒一遍加深印象&#xff0c;原文链接&#xff1a;https://zhuanlan.zhihu.com/p/36499291 【章节概览】 这章讲到2D光照效果中的辉光&#xff08;Glow&#xff09;和光晕&#xff08;Halo&#xff09;&#xff0c;展示了如何通…

Catlike Coding网站文章解析 -- 2.Procedural Grid

本章内容 创建一个闭合的cube mesh给cube添加带弧度平滑的边缘定义法线使用sub-meshes&#xff08;子mesh&#xff09;创建一个常规shader合并碰撞体1.合成一个cube 上一章https://mp.csdn.net/postedit/89474068我们已经实现了一个平面mesh。一个cube由6个平面组成&#xff…

GPU Gems1 - 23 景深技术综述

本章主要介绍如何使用GPU创建实时的景深&#xff08;Depth of Field&#xff09;效果。参考浅墨总结文章的链接https://zhuanlan.zhihu.com/p/36499291 聚焦在枪上&#xff0c;背景模糊【核心要点】 物体在距离镜头的一个范围之内能够清晰成像&#xff08;经过聚焦&#xff09…

GPU Gems1 - 22 颜色控制(Color Controls)

这章将在游戏中图像处理的讨论&#xff0c;扩展到技术和艺术上控制颜色的方法和应用&#xff0c;包括将图像从一些的色彩空间中移入移出&#xff0c;以及快速地给任何2D或3D场景加上精美的色调。 色彩校正&#xff08;Color Correction&#xff09;是几乎所有印刷和胶片成像应…

GPU Gems1 - 25 用纹理贴图进行快速过滤宽度的计算

这章介绍在片元shader中计算导数近似值的技术。这个技术把特别的值载入纹理mipmap的每个级别&#xff0c;以特殊的方式使用纹理映射硬件&#xff0c;计算出导数的结果&#xff0c;给出在屏幕上的像素间某个量的变化率。 Cg标准程序库提供ddx和ddy函数&#xff0c;计算任意关于…

GPU Gems1 - 24 高质量的过滤

在一些应用中&#xff0c;高质量的过滤是至关重要的&#xff0c;可以用像素shader代码执行任何过滤。GPU着色程序不用于CPU的主要之处在于&#xff1a;一般来说&#xff0c;CPU数学操作比纹理访问更快&#xff0c;而在GPU中恰恰相反。图像过滤的目的很简单&#xff1a;对于给你…

GPU Gems1 - 26 OpenEXR图像文件格式与HDR(The OpenEXR Image File Format and HDR)

【章节概览】 这章中&#xff0c;大名鼎鼎的工业光魔公司的Florian Kainz、Rod Bogart和DrweHess介绍了OpenEXR标准&#xff0c;这是一种当时新的高动态范围图像&#xff08;HDRI&#xff09;格式&#xff0c;在计算机成像的顶级电影中正在快速推广。对于基于图像照明的开发者…

ID Tech 5 中Megatexture针对地形的D3D9 基本实现原理

看GPU Gems2中的 使用基于GPU几何体裁剪图的地形渲染&#xff08;Terrain Rendering Using GPU-Based Geometry Clipmaps&#xff09;一文&#xff0c;对Clipmap技术不是理解很好&#xff0c;所以上网搜索一番&#xff0c;发现了这篇文章&#xff0c;实在是太棒的文章&#xff…

[知乎] 开放世界游戏中的大地图背后有哪些实现技术?

今天看到的一篇关于大世界的技术文章&#xff0c;写的太好了&#xff0c;膜拜大佬。各位如果有时间一定要看看 原文&#xff1a;http://gulu-dev.com/post/2014-11-16-open-world#toc_10 一、程序技术篇&#xff1a;算法和架构&#xff08;Programming Algorithms & Arch…

GPU Gems2 - 2 使用基于GPU几何体裁剪图的地形渲染(Terrain Rendering Using GPU-Based Geometry Clipmaps)

【章节概览】 本章描述了一种通过顶点纹理实现的&#xff0c;基于GPU的几何体裁剪图&#xff08;Geometry Clipmaps&#xff09;技术。通过把地形几何体当做一组图像来处理&#xff0c;可以在GPU上执行几乎所有的计算&#xff0c;因此可以减少CPU的负载。且该技术较为容易实现…