Search Unity

  1. Welcome to the Unity Forums! Please take the time to read our Code of Conduct to familiarize yourself with the forum rules and how to post constructively.
  2. We have updated the language to the Editor Terms based on feedback from our employees and community. Learn more.
    Dismiss Notice
  3. Join us on November 16th, 2023, between 1 pm and 9 pm CET for Ask the Experts Online on Discord and on Unity Discussions.
    Dismiss Notice
  4. Dismiss Notice

Combining WireFrame Shader and Vertex Color Shader

Discussion in 'Shaders' started by Karrzun, Nov 14, 2021.

  1. Karrzun

    Karrzun

    Joined:
    Oct 26, 2017
    Posts:
    123
    Hi everyone,

    I suck at writing shaders, that's why I need your help combining two of them into one. I'd like to have a shader, that
    a) displays the wireframe of an object
    b) uses vertex colors

    I found solutions for seperate shaders, i. e. one wireframe shader and one vertex color shader but I can't for the life of me figure out how to combine their features into one.

    Code (CSharp):
    1. Code taken from https://catlikecoding.com/unity/tutorials/advanced-rendering/flat-and-wireframe-shading/
    2.  
    3. Shader "Custom/Flat Wireframe" {
    4.  
    5.     Properties {
    6.         _Color ("Tint", Color) = (1, 1, 1, 1)
    7.         _MainTex ("Albedo", 2D) = "white" {}
    8.  
    9.         [NoScaleOffset] _NormalMap ("Normals", 2D) = "bump" {}
    10.         _BumpScale ("Bump Scale", Float) = 1
    11.  
    12.         [NoScaleOffset] _MetallicMap ("Metallic", 2D) = "white" {}
    13.         [Gamma] _Metallic ("Metallic", Range(0, 1)) = 0
    14.         _Smoothness ("Smoothness", Range(0, 1)) = 0.1
    15.  
    16.         [NoScaleOffset] _ParallaxMap ("Parallax", 2D) = "black" {}
    17.         _ParallaxStrength ("Parallax Strength", Range(0, 0.1)) = 0
    18.  
    19.         [NoScaleOffset] _OcclusionMap ("Occlusion", 2D) = "white" {}
    20.         _OcclusionStrength ("Occlusion Strength", Range(0, 1)) = 1
    21.  
    22.         [NoScaleOffset] _EmissionMap ("Emission", 2D) = "black" {}
    23.         _Emission ("Emission", Color) = (0, 0, 0)
    24.  
    25.         [NoScaleOffset] _DetailMask ("Detail Mask", 2D) = "white" {}
    26.         _DetailTex ("Detail Albedo", 2D) = "gray" {}
    27.         [NoScaleOffset] _DetailNormalMap ("Detail Normals", 2D) = "bump" {}
    28.         _DetailBumpScale ("Detail Bump Scale", Float) = 1
    29.  
    30.         _Cutoff ("Alpha Cutoff", Range(0, 1)) = 0.5
    31.  
    32.         _WireframeColor ("Wireframe Color", Color) = (0, 0, 0)
    33.         _WireframeSmoothing ("Wireframe Smoothing", Range(0, 10)) = 1
    34.         _WireframeThickness ("Wireframe Thickness", Range(0, 10)) = 1
    35.  
    36.         [HideInInspector] _SrcBlend ("_SrcBlend", Float) = 1
    37.         [HideInInspector] _DstBlend ("_DstBlend", Float) = 0
    38.         [HideInInspector] _ZWrite ("_ZWrite", Float) = 1
    39.     }
    40.  
    41.     CGINCLUDE
    42.  
    43.     #define BINORMAL_PER_FRAGMENT
    44.     #define FOG_DISTANCE
    45.  
    46.     #define PARALLAX_BIAS 0
    47. //    #define PARALLAX_OFFSET_LIMITING
    48.     #define PARALLAX_RAYMARCHING_STEPS 10
    49.     #define PARALLAX_RAYMARCHING_INTERPOLATE
    50. //    #define PARALLAX_RAYMARCHING_SEARCH_STEPS 3
    51.     #define PARALLAX_FUNCTION ParallaxRaymarching
    52.     #define PARALLAX_SUPPORT_SCALED_DYNAMIC_BATCHING
    53.  
    54.     ENDCG
    55.  
    56.     SubShader {
    57.  
    58.         Pass {
    59.             Tags {
    60.                 "LightMode" = "ForwardBase"
    61.             }
    62.             Blend [_SrcBlend] [_DstBlend]
    63.             ZWrite [_ZWrite]
    64.  
    65.             CGPROGRAM
    66.  
    67.             #pragma target 4.0
    68.  
    69.             #pragma shader_feature _ _RENDERING_CUTOUT _RENDERING_FADE _RENDERING_TRANSPARENT
    70.             #pragma shader_feature _METALLIC_MAP
    71.             #pragma shader_feature _ _SMOOTHNESS_ALBEDO _SMOOTHNESS_METALLIC
    72.             #pragma shader_feature _NORMAL_MAP
    73.             #pragma shader_feature _PARALLAX_MAP
    74.             #pragma shader_feature _OCCLUSION_MAP
    75.             #pragma shader_feature _EMISSION_MAP
    76.             #pragma shader_feature _DETAIL_MASK
    77.             #pragma shader_feature _DETAIL_ALBEDO_MAP
    78.             #pragma shader_feature _DETAIL_NORMAL_MAP
    79.  
    80.             #pragma multi_compile _ LOD_FADE_CROSSFADE
    81.  
    82.             #pragma multi_compile_fwdbase
    83.             #pragma multi_compile_fog
    84.             #pragma multi_compile_instancing
    85.             #pragma instancing_options lodfade force_same_maxcount_for_gl
    86.  
    87.             #pragma vertex MyVertexProgram
    88.             #pragma fragment MyFragmentProgram
    89.             #pragma geometry MyGeometryProgram
    90.  
    91.             #define FORWARD_BASE_PASS
    92.  
    93.             #include "MyFlatWireframe.cginc"
    94.  
    95.             ENDCG
    96.         }
    97.  
    98.         Pass {
    99.             Tags {
    100.                 "LightMode" = "ForwardAdd"
    101.             }
    102.  
    103.             Blend [_SrcBlend] One
    104.             ZWrite Off
    105.  
    106.             CGPROGRAM
    107.  
    108.             #pragma target 4.0
    109.  
    110.             #pragma shader_feature _ _RENDERING_CUTOUT _RENDERING_FADE _RENDERING_TRANSPARENT
    111.             #pragma shader_feature _METALLIC_MAP
    112.             #pragma shader_feature _ _SMOOTHNESS_ALBEDO _SMOOTHNESS_METALLIC
    113.             #pragma shader_feature _NORMAL_MAP
    114.             #pragma shader_feature _PARALLAX_MAP
    115.             #pragma shader_feature _DETAIL_MASK
    116.             #pragma shader_feature _DETAIL_ALBEDO_MAP
    117.             #pragma shader_feature _DETAIL_NORMAL_MAP
    118.  
    119.             #pragma multi_compile _ LOD_FADE_CROSSFADE
    120.  
    121.             #pragma multi_compile_fwdadd_fullshadows
    122.             #pragma multi_compile_fog
    123.          
    124.             #pragma vertex MyVertexProgram
    125.             #pragma fragment MyFragmentProgram
    126.             #pragma geometry MyGeometryProgram
    127.  
    128.             #include "MyFlatWireframe.cginc"
    129.  
    130.             ENDCG
    131.         }
    132.  
    133.         Pass {
    134.             Tags {
    135.                 "LightMode" = "Deferred"
    136.             }
    137.  
    138.             CGPROGRAM
    139.  
    140.             #pragma target 4.0
    141.             #pragma exclude_renderers nomrt
    142.  
    143.             #pragma shader_feature _ _RENDERING_CUTOUT
    144.             #pragma shader_feature _METALLIC_MAP
    145.             #pragma shader_feature _ _SMOOTHNESS_ALBEDO _SMOOTHNESS_METALLIC
    146.             #pragma shader_feature _NORMAL_MAP
    147.             #pragma shader_feature _PARALLAX_MAP
    148.             #pragma shader_feature _OCCLUSION_MAP
    149.             #pragma shader_feature _EMISSION_MAP
    150.             #pragma shader_feature _DETAIL_MASK
    151.             #pragma shader_feature _DETAIL_ALBEDO_MAP
    152.             #pragma shader_feature _DETAIL_NORMAL_MAP
    153.  
    154.             #pragma multi_compile _ LOD_FADE_CROSSFADE
    155.  
    156.             #pragma multi_compile_prepassfinal
    157.             #pragma multi_compile_instancing
    158.             #pragma instancing_options lodfade
    159.  
    160.             #pragma vertex MyVertexProgram
    161.             #pragma fragment MyFragmentProgram
    162.             #pragma geometry MyGeometryProgram
    163.  
    164.             #define DEFERRED_PASS
    165.  
    166.             #include "MyFlatWireframe.cginc"
    167.  
    168.             ENDCG
    169.         }
    170.  
    171.         Pass {
    172.             Tags {
    173.                 "LightMode" = "ShadowCaster"
    174.             }
    175.  
    176.             CGPROGRAM
    177.  
    178.             #pragma target 3.0
    179.  
    180.             #pragma shader_feature _ _RENDERING_CUTOUT _RENDERING_FADE _RENDERING_TRANSPARENT
    181.             #pragma shader_feature _SEMITRANSPARENT_SHADOWS
    182.             #pragma shader_feature _SMOOTHNESS_ALBEDO
    183.  
    184.             #pragma multi_compile _ LOD_FADE_CROSSFADE
    185.  
    186.             #pragma multi_compile_shadowcaster
    187.             #pragma multi_compile_instancing
    188.             #pragma instancing_options lodfade force_same_maxcount_for_gl
    189.  
    190.             #pragma vertex MyShadowVertexProgram
    191.             #pragma fragment MyShadowFragmentProgram
    192.  
    193.             #include "My Shadows.cginc"
    194.  
    195.             ENDCG
    196.         }
    197.  
    198.         Pass {
    199.             Tags {
    200.                 "LightMode" = "Meta"
    201.             }
    202.  
    203.             Cull Off
    204.  
    205.             CGPROGRAM
    206.  
    207.             #pragma vertex MyLightmappingVertexProgram
    208.             #pragma fragment MyLightmappingFragmentProgram
    209.  
    210.             #pragma shader_feature _METALLIC_MAP
    211.             #pragma shader_feature _ _SMOOTHNESS_ALBEDO _SMOOTHNESS_METALLIC
    212.             #pragma shader_feature _EMISSION_MAP
    213.             #pragma shader_feature _DETAIL_MASK
    214.             #pragma shader_feature _DETAIL_ALBEDO_MAP
    215.  
    216.             #include "My Lightmapping.cginc"
    217.  
    218.             ENDCG
    219.         }
    220.     }
    221.  
    222.     CustomEditor "MyLightingShaderGUI"
    223. }

    Code (CSharp):
    1. Code taken from https://gist.github.com/jhorikawa/7a236ae0b801bf2aca2d8a3038b9bf40
    2.  
    3. Shader "Custom/VertexColor" {
    4.     SubShader{
    5.         Tags { "RenderType" = "Opaque" }
    6.         LOD 200
    7.  
    8.         CGPROGRAM
    9.         #pragma surface surf Lambert vertex:vert
    10.         #pragma target 3.0
    11.  
    12.         struct Input {
    13.             float4 vertColor;
    14.         };
    15.  
    16.         void vert(inout appdata_full v, out Input o) {
    17.             UNITY_INITIALIZE_OUTPUT(Input, o);
    18.             o.vertColor = v.color;
    19.         }
    20.  
    21.         void surf(Input IN, inout SurfaceOutput o) {
    22.             o.Albedo = IN.vertColor.rgb;
    23.         }
    24.         ENDCG
    25.     }
    26.         FallBack "Diffuse"
    27. }


    If anyone can help me out here, I'd be very grateful. Thank you in advance!
     
  2. Przemyslaw_Zaworski

    Przemyslaw_Zaworski

    Joined:
    Jun 9, 2017
    Posts:
    314
    Code (CSharp):
    1. Shader "Wireframe With Vertex Colors"
    2. {
    3.     Properties
    4.     {
    5.         _Thickness ("Thickness", Range(0.001, 0.2)) = 0.02
    6.         _FrontColor ("Wireframe Color", color) = (0.0, 0.0, 1.0, 1.0)
    7.     }
    8.     SubShader
    9.     {
    10.         Pass
    11.         {
    12.             CGPROGRAM
    13.             #pragma vertex VSMain
    14.             #pragma geometry GSMain
    15.             #pragma fragment PSMain
    16.             #pragma target 4.0
    17.  
    18.             float _Thickness;
    19.             float4 _FrontColor;
    20.  
    21.             struct Data
    22.             {
    23.                 float4 vertex : SV_Position;
    24.                 float2 barycentric : BARYCENTRIC;
    25.                 float4 color : COLOR;
    26.             };
    27.  
    28.             void VSMain(inout float4 vertex:POSITION, inout float4 color : COLOR) { }
    29.  
    30.             [maxvertexcount(3)]
    31.             void GSMain( triangle float4 patch[3]:SV_Position, triangle float4 color[3]:COLOR, inout TriangleStream<Data> stream)
    32.             {
    33.                 Data GS;
    34.                 for (uint i = 0; i < 3; i++)
    35.                 {
    36.                     GS.vertex = UnityObjectToClipPos( patch[i] );
    37.                     GS.barycentric = float2(fmod(i,2.0), step(2.0,i));
    38.                     GS.color = color[i];
    39.                     stream.Append(GS);
    40.                 }
    41.                 stream.RestartStrip();
    42.             }
    43.  
    44.             float4 PSMain(Data PS) : SV_Target
    45.             {
    46.                 float3 coord = float3(PS.barycentric, 1.0 - PS.barycentric.x - PS.barycentric.y);
    47.                 coord = smoothstep(fwidth(coord)*0.1, fwidth(coord)*0.1 + fwidth(coord), coord);
    48.                 return float4(lerp(_FrontColor, PS.color, min(coord.x, min(coord.y, coord.z)).xxx), 1.0);
    49.             }
    50.             ENDCG
    51.         }
    52.     }
    53. }
     
    Karrzun likes this.
  3. Przemyslaw_Zaworski

    Przemyslaw_Zaworski

    Joined:
    Jun 9, 2017
    Posts:
    314
    Sphere has baked texture coordinates as vertex colors, test:

    upload_2021-11-18_12-22-47.png
     
  4. Karrzun

    Karrzun

    Joined:
    Oct 26, 2017
    Posts:
    123
    I gave it a quick run just now and it seems to do rxactly what I need. Thank you very much!