[Unity][Unity特效]3D物体遮挡描边
发布日期:2021-05-09 11:56:16 浏览次数:25 分类:精选文章

本文共 3140 字,大约阅读时间需要 10 分钟。

Unity 使用片段法实现方块轮廓效果材质设计

在 Unity 中,为方块添加轮廓效果和材质时,可以采用片段法来实现独特的视觉效果。本节详细介绍实现过程及相关参数优化方法。

系统概述

为了实现出色的方块材质效果,我们需要使用片段法。在这种方法中,我们将场景分割为不同的部分,每个部分对应不同的光照效果。在本例中,我们主要关注两个关键效果:轮廓效果和材质han。

细节说明

为了实现方块的轮廓效果,我们可以遵循以下步骤:

  • 创建片段模型:使用 Unity 的片段法工具创建模型片段。默认情况下,可以使用默认片段区域进行位移调整,以确保片段边缘正确对齐。
  • 片段法提供了灵活的模型调整权Force 的方式。您可以通过调整片段区域的边缘乘数来控制边缘尖锐程度,如过怀念边缘乘数值越大,边缘越锋利。

    1. 设置轮廓颜色:为了实现轮廓效果,我们添加了一个轮廓材质。所需颜色选择可以通过 gamma 调整,以获得最佳视觉效果。诸如材料设置 中的 gamma 值会极大影响边缘颜色和饱和度。

    2. 材质参数优化

      • 轮廓宽度:设置合适的轮廓宽度可以调节边缘的张开程度。过宽条纹宽度可能导致视觉效果不够自然,而过窄的条纹可能无法清晰观察到轮廓形状。

      • 背景透明度:适当调整背景的透明度,确保轮廓边缘清晰可辨。这有助于避免背景不透明度过低或过高导致的视觉扰乱。

      对于材质设计来说,选择合适的光照环境和材质反光指数等参数至关重要。过高反光指数可能会增加光泽感,使方块表面更金属化,这是实现轮廓效果的一个重要考量因素。通过调整反光指数,仍然可以控制材质的视觉表现。

      fragment 脚本详解

      以下是实现轮廓效果的片段脚本示例:

      Shader "Outlined/Silhouette Only"{    Properties    {        _OutlineColor("轮廓颜色", Color) = (0,0,0,1)        _Outline("轮廓宽度", Range(0.0, 0.03)) = 0.005    }    CGINCLUDE    #include "UnityCG.cginc"    struct appdata    {        float4 vertex : POSITION;        float3 normal : NORMAL;    };    struct v2f    {        float4 pos : POSITION;        float4 color : COLOR;    };    uniform float _Outline;    uniform float4 _OutlineColor;    v2f vert(appdata v)    {        v2f o;        o.pos = UnityMatrixTRS(UNITY_MATRIX_MVP, v.vertex);        o.pos.xy += Normalize;">> offset * o.pos.z * _Outline;        o.color = _OutlineColor;        return o;    }    ENDCG    SubShader    {        Tags { "Queue" = "Transparent" }        Pass        {            Name "BASE"            CULL OFF            ZTEST ALWAYS            ZWRITE OFF            Blend ONE ONE            Stencil            {                REF 2                COMP ALWAYS                PASS REPLACE                ZFAIL REPLACE            }            CGPROGRAM            #pragma vertex vert            #pragma fragment frag            half4 frag(v2f i) : COLOR            {                return half4(0,0,0,0);            }            ENDCG        }        Pass        {            Name "INNER"            CULL OFF            ZTEST ALWAYS            ZWRITE OFF            Blend One One            Stencil            {                REF 1                COMP ALWAYS                PASS REPLACE                ZFAIL REPLACE            }            CGPROGRAM            #pragma vertex vert2            #pragma fragment frag            v2f vert2(appdata v)            {                v2f o;                o.pos = UnityMatrixTRS(Unity_MATRIX_MVP, v.vertex);                o.color = _OutlineColor;                return o;            }            half4 frag(v2f i) : COLOR            {                return half4(0,0,0,0);            }            ENDCG        }        Pass        {            Name "OUTLINE"            CULL OFF            ZTEST ALWAYS            ZWRITE OFF            Blend ONE ONE            Stencil            {                REF 2                COMP EQUAL                PASS REPLACE                ZFAIL REPLACE            }            CGPROGRAM            #pragma vertex vert            #pragma fragment frag            half4 frag(v2f i) : COLOR            {                return i.color;            }            ENDCG        }    }    Fallback "Diffuse"}
    上一篇:[Unity问题]dataoffset != file.GetPosition()
    下一篇:[Unity]string.Format的用法

    发表评论

    最新留言

    逛到本站,mark一下
    [***.202.152.39]2025年05月02日 18时27分52秒