DeltaVR/Assets/Oculus/Interaction/Runtime/Shaders/OculusHandOutlineCG.cginc
2023-05-08 15:56:10 +03:00

110 lines
3.6 KiB
HLSL

/************************************************************************************
Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
Your use of this SDK or tool is subject to the Oculus SDK License Agreement, available at
https://developer.oculus.com/licenses/oculussdk/
Unless required by applicable law or agreed to in writing, the Utilities SDK distributed
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
ANY KIND, either express or implied. See the License for the specific language governing
permissions and limitations under the License.
************************************************************************************/
#pragma vertex outlineVertex
#pragma fragment outlineFragment
#pragma multi_compile_local __ CONFIDENCE
#pragma multi_compile_instancing
#pragma instancing_options
#pragma prefer_hlslcc gles
#pragma exclude_renderers d3d11_9x
#pragma target 3.0
//
struct OutlineVertexInput
{
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct OutlineVertexOutput
{
float4 vertex : SV_POSITION;
half4 glowColor : TEXCOORD1;
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
};
UNITY_INSTANCING_BUFFER_START(Props)
UNITY_DEFINE_INSTANCED_PROP(half4, glowColor)
UNITY_INSTANCING_BUFFER_END(Props)
OutlineVertexOutput outlineVertex(OutlineVertexInput v)
{
OutlineVertexOutput o;
UNITY_SETUP_INSTANCE_ID(v);
UNITY_INITIALIZE_OUTPUT(OutlineVertexOutput, o)
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
UNITY_TRANSFER_INSTANCE_ID(v, o);
v.vertex.xyz += v.normal * _OutlineWidth;
o.vertex = UnityObjectToClipPos(v.vertex);
half4 maskPixelColor = tex2Dlod(_FingerGlowMask, v.texcoord);
#if CONFIDENCE
int glowMaskR = maskPixelColor.r * 255;
int jointMaskB = maskPixelColor.b * 255;
int thumbMask = (glowMaskR >> 3) & 0x1;
int indexMask = (glowMaskR >> 4) & 0x1;
int middleMask = (glowMaskR >> 5) & 0x1;
int ringMask = (glowMaskR >> 6) & 0x1;
int pinkyMask = (glowMaskR >> 7) & 0x1;
int joint0 = (jointMaskB >> 4) & 0x1;
int joint1 = (jointMaskB >> 5) & 0x1;
int joint2 = (jointMaskB >> 6) & 0x1;
int joint3 = (jointMaskB >> 7) & 0x1;
half jointIntensity = saturate(
((1 - saturate(glowMaskR)) * _JointsGlow[0])
+ thumbMask * (joint0 * _JointsGlow[1]
+ joint1 * _JointsGlow[2]
+ joint2 * _JointsGlow[3]
+ joint3 * _JointsGlow[4])
+ indexMask * (joint1 * _JointsGlow[5]
+ joint2 * _JointsGlow[6]
+ joint3 * _JointsGlow[7])
+ middleMask * (joint1 * _JointsGlow[8]
+ joint2 * _JointsGlow[9]
+ joint3 * _JointsGlow[10])
+ ringMask * (joint1 * _JointsGlow[11]
+ joint2 * _JointsGlow[12]
+ joint3 * _JointsGlow[13])
+ pinkyMask * (joint0 * _JointsGlow[14]
+ joint1 * _JointsGlow[15]
+ joint2 * _JointsGlow[16]
+ joint3 * _JointsGlow[17]));
half4 glow = lerp(_OutlineColor, _OutlineJointColor, jointIntensity);
o.glowColor.rgb = glow.rgb;
o.glowColor.a = saturate(maskPixelColor.a + _WristFade) * glow.a * _OutlineOpacity;
#else
o.glowColor.rgb = _OutlineColor;
o.glowColor.a = saturate(maskPixelColor.a + _WristFade) * _OutlineColor.a * _OutlineOpacity;
#endif
return o;
}
half4 outlineFragment(OutlineVertexOutput i) : SV_Target
{
UNITY_SETUP_INSTANCE_ID(i);
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
return i.glowColor;
}