add outlining to a shader for both visible/hidden parts

223 Views Asked by At

We are working on an anatomical application in Unity, where the user can dissect a model of a human hand. We are using this script for a shader to select a structure which will be visible through the hand (so you can see its location even when its at the back/inside the hand)

// Marmoset Skyshop
// Copyright 2013 Marmoset LLC
// http://marmoset.co

Shader "Marmoset/Bumped Specular Xray" {
Properties {
    _Color   ("Diffuse Color", Color) = (1,1,1,1)
    _ColorVisible04("Color Visible", Color) = (1,0,0,0.3)
    _SpecColor ("Specular Color", Color) = (1,1,1,1)
    _SpecInt ("Specular Intensity", Float) = 1.0
    _Shininess ("Specular Sharpness", Range(2.0,8.0)) = 4.0
    _Fresnel ("Fresnel Strength", Range(0.0,1.0)) = 0.0
    _MainTex ("Diffuse(RGB) Alpha(A)", 2D) = "white" {}
    _SpecTex ("Specular(RGB) Gloss(A)", 2D) = "white" {}
    _BumpMap ("Normalmap", 2D)  = "bump" {}


    //slots for custom lighting cubemaps
    //_DiffCubeIBL ("Custom Diffuse Cube", Cube) = "black" {}

}

SubShader {
    Tags {
        "Queue"="Geometry"
        "RenderType"="Opaque"
    }
    LOD 400
    //diffuse LOD 200
    //diffuse-spec LOD 250
    //bumped-diffuse, spec 350
    //bumped-spec 400
    Pass{

    Name "BASE"
    Cull Off Lighting Off ZWrite Off ZTest Greater

    Blend SrcAlpha OneMinusSrcAlpha
    SetTexture[_MainTex]{
    constantColor[_ColorVisible04]
    Combine constant
}
    }
    //mac stuff
    CGPROGRAM
    #ifdef SHADER_API_OPENGL
        #pragma glsl
    #endif

    #pragma target 3.0
    #pragma exclude_renderers gles gles3 metal d3d11_9x flash
    #pragma surface MarmosetSurf MarmosetDirect vertex:MarmosetVert fullforwardshadows 

    #pragma multi_compile MARMO_BOX_PROJECTION_OFF MARMO_BOX_PROJECTION_ON
    #if MARMO_BOX_PROJECTION_ON 
        #define MARMO_BOX_PROJECTION
    #endif


    #pragma multi_compile MARMO_SKY_BLEND_OFF MARMO_SKY_BLEND_ON

    #if MARMO_SKY_BLEND_ON
        #define MARMO_SKY_BLEND
    #endif

    #define MARMO_HQ
    #define MARMO_SKY_ROTATION
    #define MARMO_DIFFUSE_IBL
    #define MARMO_SPECULAR_IBL
    #define MARMO_DIFFUSE_DIRECT
    #define MARMO_SPECULAR_DIRECT
    #define MARMO_NORMALMAP
    #define MARMO_MIP_GLOSS

    //#define MARMO_GLOW
    //#define MARMO_PREMULT_ALPHA
    //#define MARMO_OCCLUSION
    //#define MARMO_VERTEX_OCCLUSION
    //#define MARMO_VERTEX_COLOR
    //#define MARMO_SPECULAR_FILTER

    #include "MarmosetInput.cginc"
    #include "MarmosetCore.cginc"
    #include "MarmosetDirect.cginc"
    #include "MarmosetSurf.cginc"

    ENDCG
}

FallBack "Marmoset/Specular IBL"
}

To make this even more clear, we want to add a black outlining at the selected structure. This image should give a better idea: black outlining

We tried to adjust the script, however, the black outlining isnt applied on the parts of the structure behind other structures.

Our goal: the selected structure has a black outlining for both the visible parts and hidden parts (so the hidden parts will be shown anyways like this shader colors the hidden parts), the hidden parts will have a specific color based on the anatomical type ( like a nerve = yellow), the visible parts will show their diffuse/normal/specular maps.

This shader script works for everything named above, but the outlining part. Does anybody know how we must adjust the script? Other suggestions are welcome too!

0

There are 0 best solutions below