view | 视图(世界到相机空间)矩阵。 |
添加一个命令来设置视图矩阵。
视图矩阵是从世界空间转换到相机空间的矩阵。
当设置视图和投影矩阵时,使用SetViewProjectionMatrices 更有效率。
注意:Unity 中的相机空间与 OpenGL 约定一致,因此负 z 轴是相机的朝向。这与 Unity 的常规约定不同,在常规约定中,相机的朝向是正 z 轴。如果您手动创建视图矩阵(例如,使用 Matrix4x4.LookAt 的逆矩阵),则需要将其沿 z 轴缩放 -1 以获得正确的视图矩阵。
using UnityEngine; using UnityEngine.Rendering;
// Attach this script to a Camera and pick a mesh to render. // When you enter Play mode, a command buffer renders a green mesh at // origin position. [RequireComponent(typeof(Camera))] public class ExampleScript : MonoBehaviour { public Mesh mesh;
void Start() { var material = new Material(Shader.Find("Hidden/Internal-Colored")); material.SetColor("_Color", Color.green);
var tr = transform; var camera = GetComponent<Camera>();
// Code below does the same as what camera.worldToCameraMatrix would do. Doing // it "manually" here to illustrate how a view matrix is constructed. // // Matrix that looks from camera's position, along the forward axis. var lookMatrix = Matrix4x4.LookAt(tr.position, tr.position + tr.forward, tr.up); // Matrix that mirrors along Z axis, to match the camera space convention. var scaleMatrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, new Vector3(1, 1, -1)); // Final view matrix is inverse of the LookAt matrix, and then mirrored along Z. var viewMatrix = scaleMatrix * lookMatrix.inverse;
var buffer = new CommandBuffer(); buffer.SetViewMatrix(viewMatrix); buffer.SetProjectionMatrix(camera.projectionMatrix); buffer.DrawMesh(mesh, Matrix4x4.identity, material);
camera.AddCommandBuffer(CameraEvent.BeforeSkybox, buffer); } }