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

发表于2017-05-11
评论1 805浏览

想免费获取内部独家PPT资料库?观看行业大牛直播?点击加入腾讯游戏学院游戏程序行业精英群

711501594

在移植UE4的Temporal AA到Unity过程中,计算Camera Motion、Jitter等遇到矩阵变换、深度纹理和杂项这些问题,因此在这里记录一下。

ps. 这些问题其实主要是……文档不全造成的

矩阵变换

在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()

原文链接

著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

游戏学院公众号二维码
腾讯游戏学院
微信公众号

提供更专业的游戏知识学习平台