123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- /**
- * Copyright(c) Live2D Inc. All rights reserved.
- *
- * Use of this source code is governed by the Live2D Open Software license
- * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.
- */
- #ifndef CUBISM_CG_INCLUDED
- #define CUBISM_CG_INCLUDED
- #include "UnityCG.cginc"
- inline float4 CubismGetMaskChannel(float4 tile)
- {
- return tile.xxxx == float4(0, 1, 2, 3);
- }
- inline float4 CubismGetClippedMaskChannel(float2 coordinates, float4 tile)
- {
- float2 bound = tile.yz * tile.w;
- float isInside =
- step(bound.x, coordinates.x)
- * step(bound.y, coordinates.y)
- * step(coordinates.x, bound.x + tile.w)
- * step(coordinates.y, bound.y + tile.w);
- return CubismGetMaskChannel(tile) * isInside;
- }
- inline float2 CubismToMaskCoordinates(float2 vertex, float4 tile, float4 transform)
- {
- float2 result = vertex;
- float scale = tile.w * transform.z;
- float2 offset = transform.xy;
- float2 origin = (tile.yz + float2(0.5, 0.5)) * tile.ww;
- result.xy -= offset;
- result *= scale;
- result.xy += origin;
- return result;
- }
- inline float4 CubismToMaskClipPos(float2 vertex, float4 tile, float4 transform)
- {
- float2 result = CubismToMaskCoordinates(vertex, tile, transform);
- result *= 2;
- result.xy = float2(result.x, (result.y * _ProjectionParams.x));
- result.xy -= float2(1, _ProjectionParams.x);
- return float4(result.xy, 1, 1);
- }
- inline float CubismSampleMaskTexture(sampler2D tex, float4 channel, float2 coordinates)
- {
- float4 texel = tex2D(tex, coordinates.xy) * channel;
- return texel.r + texel.g + texel.b + texel.a;
- }
- #if defined (CUBISM_MASK_ON) || defined(CUBISM_INVERT_ON)
- #define CUBISM_MASK_SHADER_VARIABLES \
- sampler2D cubism_MaskTexture; \
- float4 cubism_MaskTile; \
- float4 cubism_MaskTransform;
- #define CUBISM_TO_MASK_CLIP_POS(IN, OUT) OUT.vertex = CubismToMaskClipPos(IN.vertex, cubism_MaskTile, cubism_MaskTransform);
- #define CUBISM_MASK_CHANNEL CubismGetMaskChannel(cubism_MaskTile)
- #define CUBISM_VERTEX_OUTPUT float2 cubism_MaskCoordinates : TEXCOORD3;
- #define CUBISM_INITIALIZE_VERTEX_OUTPUT(IN, OUT) OUT.cubism_MaskCoordinates = CubismToMaskCoordinates(IN.vertex, cubism_MaskTile, cubism_MaskTransform);
- #if defined(CUBISM_INVERT_ON)
- #define CUBISM_APPLY_MASK(IN, COLOR) \
- float4 cubism_maskChannel = CubismGetClippedMaskChannel(IN.cubism_MaskCoordinates, cubism_MaskTile); \
- float cubism_maskAlpha = CubismSampleMaskTexture(cubism_MaskTexture, cubism_maskChannel, IN.cubism_MaskCoordinates); \
- COLOR *= 1.0 - cubism_maskAlpha;
- #else
- #define CUBISM_APPLY_MASK(IN, COLOR) \
- float4 cubism_maskChannel = CubismGetClippedMaskChannel(IN.cubism_MaskCoordinates, cubism_MaskTile); \
- float cubism_maskAlpha = CubismSampleMaskTexture(cubism_MaskTexture, cubism_maskChannel, IN.cubism_MaskCoordinates); \
- COLOR *= cubism_maskAlpha;
- #endif
- #else
- #define CUBISM_MASK_SHADER_VARIABLES
- #define CUBISM_TO_MASK_CLIP_POS(IN, OUT)
- #define CUBISM_MASK_CHANNEL float4(1, 1, 1, 1)
- #define CUBISM_VERTEX_OUTPUT
- #define CUBISM_INITIALIZE_VERTEX_OUTPUT(IN, OUT)
- #define CUBISM_APPLY_MASK(IN, COLOR)
- #endif
- #define CUBISM_SHADER_VARIABLES \
- float cubism_ModelOpacity; \
- CUBISM_MASK_SHADER_VARIABLES
- #define CUBISM_APPLY_ALPHA(IN, COLOR) \
- COLOR.rgb *= COLOR.a; \
- CUBISM_APPLY_MASK(IN, COLOR); \
- COLOR *= cubism_ModelOpacity;
- #endif
|