- CSharp
- Shader
- 配置参数:
- HidenCamera的Camera.enable = false
- Main Camera的视角
- HidenCamera的视角
- 运行效果
- 看看实时的调整挂点对象,与HidenCamera
因为我之前看:CommandBuffer.DrawMesh
的第二个矩阵的参数设置写着://Transformation matrix to use.
所以我以为是MVP
的矩阵。
但是测试之后我发现我理解错了。
运来是 本地转换到世界坐标的变换矩阵,它就不能写类似: Transformations Local to world matrix to use
吗?这样描述多好理解。
为何要测试这个呢?因为CommandBuffer
刚用不久,然后急着实现某些功能,我就暂时跳过了CommandBuffer
因为注释描述不够准确的问题,昨天用CommandBuffer.DrawMesh
去绘制实现SSSM
(屏幕空间阴影)的RT
(这里没去用Camera.RenderWithShader
)功能。
但是因为我觉得,Unity官方肯定不会连LocalToWorld
的矩阵都不给设置吧,这多蛋疼,想象就知道是自己的使用姿势不对,所以现在回过头来测试。
虽然MVP矩阵通过CommandBuffer.SetViewProjectionMatrixes,与DrawMesh 算是设置对了,但是_ProjectionParams.w但不是1/far的值,我估计是否这样用法的人很少,没人踩过这个坑? 很有可能是因为CommandBuffer.SetViewProjectionMatrixes并没有对_ProjectionParams更新,那么其他的变量也是极有可能也是没有更新的,所以用CommandBuffer来SetViewProjectionMatrixes后渲染处理还是妥妥的用回自定义的矩阵来处理。
CSharpusing UnityEngine;
using UnityEngine.Rendering;
// jave.lin 2020.04.15 测试 CommandBuffer.SetViewProjectionMatrices 与测试 CommandBuffer.DrawMesh 配合使用设置Unity内置变换矩阵
public class CmdBuffSetViewProjTesting : MonoBehaviour
{
public Camera cam; // 用于观察的Camera
public Camera hidenCam; // 用于类似RT渲染用的Camera,看看能否指定M,V,P各个矩阵
public Material mat; // 绘制用的材质
public GameObject cubeHolder; // Cube的LocalToWorldMatrix的挂点对象
public bool withCubeHolder = true; // 是否使用Cube挂点
public bool setViewProj = true; // 是否设置CommandBuffer.SetViewProjectionMatrices
private CommandBuffer cmdBuff;
private Mesh mesh;
private void Start()
{
cmdBuff = new CommandBuffer();
cmdBuff.name = "[Testing CmdBuff Set V P & DrawMesh]";
var cubeGO = GameObject.CreatePrimitive(PrimitiveType.Cube);
mesh = cubeGO.GetComponent().mesh;
Destroy(cubeGO);
}
private void OnRenderObject()
{
cmdBuff.Clear();
if (setViewProj)
{
cmdBuff.SetViewProjectionMatrices(hidenCam.worldToCameraMatrix, GL.GetGPUProjectionMatrix(hidenCam.projectionMatrix, false));
}
if (withCubeHolder)
{ // 所以DrawMesh的第二个Matrix4x4就是L2W的矩阵
// 从CommandBuffer的API可以看到各个DrawXXX()中的Matrix的注释都是一样的,说明都是LocalToWorldMatrix。
cmdBuff.DrawMesh(mesh, cubeHolder.transform.localToWorldMatrix, mat);
}
else
{
cmdBuff.DrawMesh(mesh, Matrix4x4.identity, mat);
}
Graphics.ExecuteCommandBuffer(cmdBuff);
}
}
Shader
// jave.lin 2020.04.15 - 测试 CommandBuffer.SetViewProjectionMatrixes 与 CommandBuffer.DrawMesh 的MVP设置
Shader "Custom/CmdBuffDrawShader" {
Properties {
_MainTex ("Texture", 2D) = "white" {}
_MainColor ("Color", Color) = (1,1,1,1)
}
SubShader {
Tags { "RenderType"="Opaque" }
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata {
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f {
float4 vertex : SV_POSITION;
float2 uv : TEXCOORD0;
};
sampler2D _MainTex;
float4 _MainTex_ST;
fixed4 _MainColor;
v2f vert (appdata v) {
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
fixed4 frag (v2f i) : SV_Target {
fixed4 col = tex2D(_MainTex, i.uv);
return col * _MainColor;
}
ENDCG
}
}
}
配置参数:
HidenCamera
的Camera.enable = false
的,这样就不影响Main Camera
的渲染。
留意HidenCamera
是朝着太阳的,视口可以看到太阳,Main Camera
是看不到的。