Clip Space、NDC、Screen Space

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Clip Space、NDC、Screen Space相关的知识,希望对你有一定的参考价值。

参考技术A

先看两张图片:

可以看到裁剪空间(Clip Space)最后会转换到屏幕空间(Screen Space),最终输出到屏幕上并显示正确的图像,模型空间-->世界空间-->观察空间,这几步是比较容易理解的,直接通过矩阵转换就可以得到相应的坐标,但是裁剪空间-->屏幕空间,其实还有两个中间步骤:转换到NDC(标准化设备坐标)与屏幕映射(OpenGL好像叫视口变换)。
先解释下裁剪空间,观察空间实际就是相机为原点的空间,而相机可分为透视模式和正交模式,透视模式的可视区域是一个梯形的椎体,正交模式是一个矩形,如下:

无论哪种模式,都是有可视范围的,超出可视范围(近裁剪平面、远裁剪平面和上下左右边界)的物体就看不到,看不到的东西就没有必要渲染,所以要将不可见的物体裁剪掉,留下可见的范围内的物体就可以了,所以裁剪空间实际上是在观察空间的基础上增加了一个区域限制,把坐标限制在可见的范围内。

转换到裁剪空间后经过GPU的裁剪处理就可以得到最终需要被渲染的物体顶点坐标了,接下来GPU会做透视除法将顶点转换到NDC中,透视除法将裁剪空间中顶点的4个分量都除以w分量,就从裁剪空间转换到了NDC了,NDC是一个长宽高取值范围为[-1,1]的立方体,具体的推导就不展开说了,网上有很多大牛的详细推导过程。

注:在DirectX里面,NDC的z方向取值范围是[0,1],在Unity中可以用UNITY_NEAR_CLIP_VALUE获取z方向近平面的值,在openGL环境下是-1.0,DirectX中是0.0。

将顶点坐标都转换到NDC后,下一步就是屏幕映射,这个就取决于最终要渲染到的窗体分辨率,注意是窗体分辨率,不是屏幕分辨率,因为在移动平台上一般不允许改变渲染窗体的分辨率,通常是全屏显示,也就是屏幕分辨率,而pc上修改窗体大小改变分辨率就比较普遍,最终通过屏幕映射得到屏幕空间的坐标。在Unity中,屏幕空间左下角的像素坐标是(0,0),右上角是(pixelWidth,pixelHeight)。
(Vertex Shader) => Clip Space => (透视除法) => NDC => (视口变换) => Screen Space => (Fragment Shader)
不过这些Unity会自动帮助我们完成,我们只需要知道原理就可以了。

soft alpha test/screen space reflection

http://www.crytek.com/cryengine/presentations/secrets-of-cryengine-3-graphics-technology

很多宝贝里面

不止题目那俩

前者不用msaa的话用后处理

后者 ray tracing

 *******************************************

screen space reflection /real time local reflection

1.为每个像素计算反射vector(deferred depth and normal)这里需要normal

2.ray march along reflect vector(拿depth01)

3.depth01与sample depth检测 

4.if hit sample last frame color

 

看起来合适deferred shading

 

********************************************

screen space selt-shadow

soft shadow

contact shadow

======================

skin

http://www.iryoku.com/stare-into-the-future

以上是关于Clip Space、NDC、Screen Space的主要内容,如果未能解决你的问题,请参考以下文章

从depth buffer中构建view-space position

screen space reflection啥意思

翻译View Frustum Culling --3 Clip Space Approach – Extracting the Planes

Stochastic Screen Space Reflections:理论

soft alpha test/screen space reflection

Project Point 方法:将 rawFeaturePoint 转换为 Screen Space