Version: 2023.2
LanguageEnglish
  • C#

CommandBuffer.SetViewMatrix

Suggest a change

Success!

Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.

Close

Submission failed

For some reason your suggested change could not be submitted. Please <a>try again</a> in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.

Close

Cancel

Declaration

public void SetViewMatrix(Matrix4x4 view);

Parameters

view View (world to camera space) matrix.

Description

Add a command to set the view matrix.

The view matrix is the matrix that transforms from world space into camera space.

When setting both view and projection matrices, it is more efficient to use SetViewProjectionMatrices.

Note: The camera space in Unity matches OpenGL convention, so the negative z-axis is the camera's forward. This is different from usual Unity convention, where the camera's forward is the positive z-axis. If you are manually creating the view matrix, for example with an inverse of Matrix4x4.LookAt, you need to scale it by -1 along the z-axis to get a proper view matrix.

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); } }