Unity中矩阵变换、深度纹理及杂项

Author Avatar
Kanglai Qian 2月 21, 2015

在移植UE4的Temporal AA到Unity过程中,计算Camera Motion、Jitter等遇到了若干坑,记录一下。其实这些问题其实主要是……文档不全造成的

矩阵变换

在Unity里有Model/World/View/Projection Space,需要将模型的坐标一步步转化最终得到投影坐标;这个在DirectX/OpenGL里也大同小异,就不具体解释。对应Shader代码:

mul(UNITY_MATRIX_MVP, v.vertex);

如果说要拆开来写,就是先从Model到World,然后World到View,最后到Project(具体变量参考文档ShaderLab built-in values):

mul(UNITY_MATRIX_P, mul(UNITY_MATRIX_V, mul(_Object2World, v.vertex)));

然后我费了老大的劲找到了这三个矩阵具体对应API,之后想算啥都行了(aras-p应该是官方大大)

Matrix4x4 world = transform.localToWorldMatrix;
Matrix4x4 view = camera.worldToCameraMatrix;
Matrix4x4 proj = camera.projectionMatrix;

Depth Texture

之前看文档Camera’s Depth Texture和SSAO例子,我一直以为只能在_CameraDepthNormalsTexture使用DecodeDepthNormal来读取深度信息。后来看了Unity Shaders – Depth and Normal Textures (Part 2)之后,我才发现可以直接读取:tex2Dproj(_CameraDepthTexture, UNITY_PROJ_COORD(i.scrPos)).r!这样就方便了很多,而且不是变换过之后的深度。

提一句题外话就是根据平台不同,有点平台是直接传入ZBuffer;而有的是利用Camera.RenderWithShader函数重新渲染一遍、画上深度信息。

执行流程

Execution Order of Event Functions里面有一张图,是可用函数的调用顺序然后在写代码的时候发现unity自己的渲染管线很容易被搞乱,应该是它代码里的各种检查不够多……总之写起来各种小心 譬如RenderTexture.activeGraphics.Blit之间就会影响。。。

Camera.projectionMatrix

之前我写在onPreRender()里,后来把代码扔到Shadow Gun Sample Level之后发现无效,又去查了下也是放到Update()里才行,奇怪奇怪~

总之还是要多多参考Execution Order,黑盒无奈>_<

Screen.widthScreen.height

获取分辨率不能放在onEnable(),不然禁用之后重新启用会获得奇怪的数据(真坑)……最后我也是塞到Update()