Initial Commit
This commit is contained in:
@@ -0,0 +1,147 @@
|
||||
/*
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Licensed under the Oculus SDK License Agreement (the "License");
|
||||
* you may not use the Oculus SDK except in compliance with the License,
|
||||
* which is provided at the time of installation or download, or which
|
||||
* otherwise accompanies this software in either electronic or hard copy form.
|
||||
*
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://developer.oculus.com/licenses/oculussdk/
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, the Oculus 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 multi_compile_fwdbase nolightmap nodirlightmap nodynlightmap novertexlight
|
||||
|
||||
#pragma prefer_hlslcc gles
|
||||
#pragma exclude_renderers d3d11_9x
|
||||
#pragma target 2.0
|
||||
|
||||
//
|
||||
|
||||
struct VertexInput {
|
||||
float4 vertex : POSITION;
|
||||
half3 normal : NORMAL;
|
||||
half4 vertexColor : COLOR;
|
||||
float4 texcoord : TEXCOORD0;
|
||||
float4 texcoord1 : TEXCOORD1;
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||||
};
|
||||
|
||||
struct VertexOutput {
|
||||
float4 vertex : SV_POSITION;
|
||||
float3 worldPos : TEXCOORD1;
|
||||
float3 worldNormal : TEXCOORD2;
|
||||
half4 glowColor : COLOR;
|
||||
float4 texcoord1 : TEXCOORD3;
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||||
UNITY_VERTEX_OUTPUT_STEREO
|
||||
};
|
||||
|
||||
VertexOutput baseVertex(VertexInput v) {
|
||||
VertexOutput o;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||||
UNITY_TRANSFER_INSTANCE_ID(v, o);
|
||||
|
||||
o.worldPos = mul(unity_ObjectToWorld, v.vertex);
|
||||
o.worldNormal = UnityObjectToWorldNormal(v.normal);
|
||||
o.vertex = UnityObjectToClipPos(v.vertex);
|
||||
o.texcoord1 = v.texcoord1;
|
||||
half4 maskPixelColor = tex2Dlod( _FingerGlowMask, float4(v.texcoord.xy, 0.0, 0.0));
|
||||
o.glowColor.rgb = float3(0.0, 0.0, 0.0);
|
||||
o.glowColor.a = saturate(maskPixelColor.a + _WristFade) * _Opacity;
|
||||
return o;
|
||||
}
|
||||
|
||||
#include "GlowFunctions.cginc"
|
||||
|
||||
void getFingerStrength(out float fingerStrength[5]) {
|
||||
float strengthValuesUniforms[5] = {
|
||||
_ThumbGlowValue,
|
||||
_IndexGlowValue,
|
||||
_MiddleGlowValue,
|
||||
_RingGlowValue,
|
||||
_PinkyGlowValue
|
||||
};
|
||||
fingerStrength = strengthValuesUniforms;
|
||||
}
|
||||
|
||||
void getFillFingerLines(out float4 lines[5]) {
|
||||
float4 _lines[5] = {
|
||||
_ThumbLine,
|
||||
_IndexLine,
|
||||
_MiddleLine,
|
||||
_RingLine,
|
||||
_PinkyLine
|
||||
};
|
||||
lines = _lines;
|
||||
}
|
||||
|
||||
float4 getFillFingerLineByIndex(int index) {
|
||||
if(index == 0) { return _ThumbLine; }
|
||||
if(index == 1) { return _IndexLine; }
|
||||
if(index == 2) { return _MiddleLine; }
|
||||
if(index == 3) { return _RingLine; }
|
||||
if(index == 4) { return _PinkyLine; }
|
||||
return float4(0.0,0.0,0.0,0.0);
|
||||
}
|
||||
|
||||
half4 applyGlow(int glowType, float3 color, float alpha, float2 texCoord, float3 worldPosition) {
|
||||
if (glowType == 30 || glowType == 32) {
|
||||
float4 gradientLine = getFillFingerLineByIndex(_FingerGlowIndex);
|
||||
float2 gradientRadius = getFingerRadiusByIndex(_FingerGlowIndex);
|
||||
bool useGlow;
|
||||
float2 fingerGradient = movingFingerGradient(texCoord, gradientLine, gradientRadius, _GlowParameter, _GlowMaxLength, useGlow);
|
||||
if (useGlow) {
|
||||
float param = 1.0 - fingerGradient.y;
|
||||
float glowValue = saturate(param * param * step(0.0, param));
|
||||
return half4(color + _GlowColor * glowValue, alpha);
|
||||
}else {
|
||||
return half4(color, alpha);
|
||||
}
|
||||
}
|
||||
else if (glowType == 27 || glowType == 29) {
|
||||
float fingerStrength[5];
|
||||
getFingerStrength(fingerStrength);
|
||||
float4 lines[5];
|
||||
getFillFingerLines(lines);
|
||||
float2 fingerRadius[5];
|
||||
getFingerRadius(fingerRadius);
|
||||
float glowValue = movingFingersGradient(texCoord, fingerStrength, _GlowParameter, lines, fingerRadius);
|
||||
return half4(color + _GlowColor * glowValue, alpha);
|
||||
}
|
||||
else if (glowType == 16 || glowType == 17) {
|
||||
float gradient = invertedSphereGradient(_GlowPosition, worldPosition, _GlowMaxLength);
|
||||
float3 glowColor = _GlowColor * gradient * _GlowParameter;
|
||||
return float4(saturate(color + glowColor), alpha);
|
||||
}
|
||||
else if (glowType == 11 || glowType == 15) {
|
||||
float gradient = movingSphereGradient(_GlowPosition, worldPosition, _GlowMaxLength, _GlowParameter, 1.5);
|
||||
float3 glowColor = _GlowColor * gradient;
|
||||
return float4(saturate(color + glowColor), alpha);
|
||||
}
|
||||
else {
|
||||
return half4(color, alpha);
|
||||
}
|
||||
}
|
||||
|
||||
half4 baseFragment(VertexOutput i) : SV_Target {
|
||||
float3 worldViewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));
|
||||
float fresnelNdot = dot(i.worldNormal, worldViewDir);
|
||||
float fresnel = 1.0 * pow(1.0 - fresnelNdot, _FresnelPower);
|
||||
float4 color = lerp(_ColorTop, _ColorBottom, fresnel);
|
||||
|
||||
if (_GenerateGlow == 1) {
|
||||
return applyGlow(_GlowType, color.rgb, i.glowColor.a, i.texcoord1, i.worldPos);
|
||||
} else {
|
||||
return half4(color.rgb, i.glowColor.a);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user