Newer
Older
HoloAnatomy / Assets / HoloToolkit-Examples / Medical / Shaders / VolumeRenderShared.cginc
SURFACEBOOK2\jackwynne on 25 May 2018 1 KB v1
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See LICENSE in the project root for license information.

#include "math.cginc"

float4 _VolBufferSize;
float4 _VolTextureFactor;
float4x4 _WorldToVolume;
sampler3D _VolTex;

float4 SlabMin; //xyz are offsets of respective slab near planes.  w is unused.
float4 SlabMax; //xyz are offsets of respective slab far planes.  w is unused.

struct vertexInput
{
    float4 vertex : POSITION;
};

struct vertexOutputFull
{
    float4 pos : SV_POSITION;
    float3 posVolSpace : TEXCOORD0;
    nointerpolation float3 cameraPosVolSpace : TEXCOORD2;
};

float4 SampleVolTex(sampler3D tex, float3 coord)
{
    return tex3D(tex, coord * _VolTextureFactor.xyz);
}

float4 AlphaBlendPremultiplied(float4 dst, float4 src)
{
    return src + dst * (1.0 - src.a);
}

float4 AlphaBlendNonPremultiplied(float4 dst, float4 src)
{
    float4 res = (src * src.a) + (dst - dst * src.a);
    res.a = src.a + (dst.a - dst.a*src.a);
    return res;
}

vertexOutputFull vertFull(vertexInput input)
{
    vertexOutputFull output;
    UNITY_INITIALIZE_OUTPUT(vertexOutputFull, output);

    float4 posWorldSpace = mul(unity_ObjectToWorld, input.vertex);
    output.posVolSpace = mul(_WorldToVolume, posWorldSpace);

    //TODO: this should come down in a constant buffer
    output.cameraPosVolSpace = mul(_WorldToVolume, float4(_WorldSpaceCameraPos, 1));

    output.pos = UnityObjectToClipPos(input.vertex);

    return output;
}