首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ShaderLab偏移量不呈现一个多边形高于另一个多边形

ShaderLab偏移量不呈现一个多边形高于另一个多边形
EN

Stack Overflow用户
提问于 2019-05-26 04:01:38
回答 1查看 709关注 0票数 0

我有两个着色器,UnlitRGBA和TransparentNoOverlap。它们如下:

UnlitRGBA.shaderlab

代码语言:javascript
复制
// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)
// modified by rbjacob101

Shader "Particles/Standard Unlit (RGBA)"
{
    Properties
    {
        _MainTex("Albedo", 2D) = "white" {}
    _Color("Color", Color) = (1,1,1,1)

        _Cutoff("Alpha Cutoff", Range(0.0, 1.0)) = 0.5

        _BumpScale("Scale", Float) = 1.0
        _BumpMap("Normal Map", 2D) = "bump" {}

    _EmissionColor("Color", Color) = (0,0,0)
        _EmissionMap("Emission", 2D) = "white" {}

    _DistortionStrength("Strength", Float) = 1.0
        _DistortionBlend("Blend", Range(0.0, 1.0)) = 0.5

        _SoftParticlesNearFadeDistance("Soft Particles Near Fade", Float) = 0.0
        _SoftParticlesFarFadeDistance("Soft Particles Far Fade", Float) = 1.0
        _CameraNearFadeDistance("Camera Near Fade", Float) = 1.0
        _CameraFarFadeDistance("Camera Far Fade", Float) = 2.0

        // Hidden properties
        [HideInInspector] _Mode("__mode", Float) = 0.0
        [HideInInspector] _ColorMode("__colormode", Float) = 0.0
        [HideInInspector] _FlipbookMode("__flipbookmode", Float) = 0.0
        [HideInInspector] _LightingEnabled("__lightingenabled", Float) = 0.0
        [HideInInspector] _DistortionEnabled("__distortionenabled", Float) = 0.0
        [HideInInspector] _EmissionEnabled("__emissionenabled", Float) = 0.0
        [HideInInspector] _BlendOp("__blendop", Float) = 0.0
        [HideInInspector] _SrcBlend("__src", Float) = 1.0
        [HideInInspector] _DstBlend("__dst", Float) = 0.0
        [HideInInspector] _ZWrite("__zw", Float) = 1.0
        [HideInInspector] _Cull("__cull", Float) = 2.0
        [HideInInspector] _SoftParticlesEnabled("__softparticlesenabled", Float) = 0.0
        [HideInInspector] _CameraFadingEnabled("__camerafadingenabled", Float) = 0.0
        [HideInInspector] _SoftParticleFadeParams("__softparticlefadeparams", Vector) = (0,0,0,0)
        [HideInInspector] _CameraFadeParams("__camerafadeparams", Vector) = (0,0,0,0)
        [HideInInspector] _ColorAddSubDiff("__coloraddsubdiff", Vector) = (0,0,0,0)
        [HideInInspector] _DistortionStrengthScaled("__distortionstrengthscaled", Float) = 0.0
    }

        Category
    {
        SubShader
    {
        Tags{ "RenderType" = "Opaque" "IgnoreProjector" = "True" "PreviewType" = "Plane" "PerformanceChecks" = "False" }

        BlendOp[_BlendOp]
        Blend[_SrcBlend][_DstBlend]
        ZWrite[_ZWrite]
        Offset -1, -1
        Cull[_Cull]
        ColorMask RGBA

        GrabPass
    {
        Tags{ "LightMode" = "Always" }
        "_GrabTexture"
    }

        Pass
    {
        Name "ShadowCaster"
        Tags{ "LightMode" = "ShadowCaster" }

        BlendOp Add
        Blend One Zero
        ZWrite On
        Cull Off

        CGPROGRAM
#pragma target 2.5

#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON _ALPHAMODULATE_ON
#pragma shader_feature _ _COLOROVERLAY_ON _COLORCOLOR_ON _COLORADDSUBDIFF_ON
#pragma shader_feature _REQUIRE_UV2
#pragma multi_compile_shadowcaster
#pragma multi_compile_instancing
#pragma instancing_options procedural:vertInstancingSetup

#pragma vertex vertParticleShadowCaster
#pragma fragment fragParticleShadowCaster

#include "UnityStandardParticleShadow.cginc"
        ENDCG
    }

        Pass
    {
        Tags{ "LightMode" = "ForwardBase" }

        CGPROGRAM
#pragma multi_compile __ SOFTPARTICLES_ON
#pragma multi_compile_fog
#pragma target 2.5

#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON _ALPHAMODULATE_ON
#pragma shader_feature _ _COLOROVERLAY_ON _COLORCOLOR_ON _COLORADDSUBDIFF_ON
#pragma shader_feature _NORMALMAP
#pragma shader_feature _EMISSION
#pragma shader_feature _FADING_ON
#pragma shader_feature _REQUIRE_UV2
#pragma shader_feature EFFECT_BUMP

#pragma vertex vertParticleUnlit
#pragma fragment fragParticleUnlit
#pragma multi_compile_instancing
#pragma instancing_options procedural:vertInstancingSetup

#include "UnityStandardParticles.cginc"
        ENDCG
    }
    }
    }

        Fallback "VertexLit"
        CustomEditor "StandardParticlesShaderGUI"
}

TransparentNoOverlap.shader

代码语言:javascript
复制
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

/*
 * Taken from:
 * https://forum.unity.com/threads/transparent-depth-shader-good-for-ghosts.149511/
 */

Shader "Transparent/TransparentNoOverlap" {
Properties {
     [PerRendererData]_Color ("Main Color", Color) = (1,1,1,1)
    _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
}

SubShader {
    Tags {"RenderType"="Transparent" "Queue"="Transparent" "IgnoreProjector"="True"}
    LOD 200

    Pass {
        Name "TRANSPARENT"

        ZWrite On
        ZTest LEqual
        Blend SrcAlpha OneMinusSrcAlpha
        ColorMask RGBA

        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag
        #include "UnityCG.cginc"

        fixed4 _Color;

        struct v2f {
            float4 pos : SV_POSITION;
        };

        v2f vert (appdata_base v)
        {
            v2f o;
            o.pos = UnityObjectToClipPos (v.vertex);
            return o;
        }

        half4 frag (v2f i) : COLOR
        {
            return _Color;
        }
        ENDCG  
    }

    CGPROGRAM
    #pragma surface surf Lambert alpha
    #pragma debug

    sampler2D _MainTex;
    fixed4 _Color;

    struct Input {
        float2 uv_MainTex;
    };

    void surf (Input IN, inout SurfaceOutput o) {
        fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
        o.Albedo = c.rgba;
        o.Alpha = c.a;
    }
    ENDCG
}

Fallback "Transparent/Diffuse"
}

我希望使用UnlitRGBA的材料总是在TransparentNoOverlap上呈现。我会怎样做才能取得这个结果呢?我尝试过将Offset -1, -1Offset 0, -1添加到UnlitRGBA中。当对标准表面着色器进行测试时,它工作得很好,并且UnlitRGBA始终在上面呈现。但是在用TransparentNoOverlap进行渲染时,要么是z格斗,要么是TransparentNoOverlap总是在上面呈现。为什么会这样呢?我认为这可能与ZTests或ZWrites有关,但我最终还是不确定。

我为大量的代码样本道歉..。谢谢你能提供的任何帮助。

罗杰克布

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-26 22:57:13

请注意,预期的结果和设置略显模糊,因此可能有几种方法可供选择。

简单地说:材质有着色器A(未亮)被B覆盖(透明),因为B是在它之后画。“队列”=“透明”是B. Shader A中负责此效果的标志,因此它使用默认的“几何”队列。(您可以在这里阅读到在“遮罩”下使用的索引值:https://docs.unity3d.com/Manual/SL-SubShaderTags.html)。因此,在这方面,您可以显式地指定队列索引,并确保它们与预期的行为相匹配。

这忽略了另一个方面: ZBuffer处理一个网格被另一个网格遮挡,因此它们实际上不依赖于该绘制顺序。可以根据深度测试丢弃像素,如果指定这样做,则对象可以写入深度。(https://docs.unity3d.com/Manual/SL-CullAndDepth.html)

网格显示z格斗,如果它们都是写和测试的,并且是共面的(在同一个位置),或者缓冲区的精度很低,所以存储的值使它们看起来像是。

如果你的网格需要被遮挡和封闭他人和自己,一种方法是设置B(透明的)来使用ZTest Less,这样只有当A根本不存在时,即使是在A之后绘制,即使它与A共面,也只会出现。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56310536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档