这个是在场景中Quad的Shader
Shader "Custom/XRay"
{
SubShader
{
Tags { "Queue"="Transparent+1" }
Pass { Blend Zero One}
}
FallBack "Diffuse"
}
这个是可供xray看见里面的外表的Cube
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MakeSeeThrough : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
GetComponent<Renderer>().material.renderQueue = 3002;
}
}
场景中离相机近的是Quad ,Cube 较远
Cube 里面有一个Sphere
在拖动Quad的时候,Quad里能显示Sphere 而不显示Cube
效果
原理
让我们逐步分析渲染流程,解释为什么拖动 Quad 时可以看到 Cube 内部的 Sphere:
(1) 正常情况下(没有 Quad)
Cube:
使用 Custom/XRay Shader,渲染队列为 Transparent+1 (3001)。
渲染时,Cube 不会显示颜色(因为 Blend Zero One),但会写入深度缓冲。
Sphere:
由于 Cube 不会显示颜色,Sphere 的颜色会透过 Cube 显示出来。
(2) 使用 Quad 并拖动时
Quad:
使用 MakeSeeThrough 脚本,渲染队列为 3002。
由于 Quad 的渲染队列比 Cube 高,它会在 Cube 之后渲染。
渲染顺序:
Cube:
使用 Custom/XRay Shader,渲染队列为 3001。
渲染时,Cube 不会显示颜色(因为 Blend Zero One),但会写入深度缓冲。
Quad:
使用 MakeSeeThrough 脚本,渲染队列为 3002。
渲染时,Quad 会通过深度测试,并显示在 Cube 的后面。
Sphere:
Sphere 的渲染队列为默认值(Geometry,2000),它会在 Cube 和 Quad 之前渲染。
由于 Cube 不会显示颜色,Sphere 的颜色会透过 Cube 显示出来。
(3) 为什么拖动 Quad 时会显示 Sphere
Quad 的作用:
Quad 的渲染队列为 3002,确保它在 Cube 之后渲染。
由于 Cube 不会显示颜色,Sphere 的颜色会透过 Cube 显示出来。
当 Quad 渲染时,它会通过深度测试,并显示在 Cube 的后面。
透视效果:
由于 Quad 不会显示颜色,Sphere 的颜色会透过 Quad 显示出来。
拖动 Quad 时,Quad 的位置和角度会改变,从而影响 Sphere 的可见区域。