unity 中的 xray 效果

这个是在场景中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

效果


img_v3_02kg_52092cf3-fbf7-4d22-9f97-7bab5231db5g.gif

原理

让我们逐步分析渲染流程,解释为什么拖动 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 的可见区域。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容