Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Shader "Custom/Liquid_Shader"
- {
- Properties
- {
- [HDR]_TintColor("Color", Color) = (1,1,1,1)
- [HDR]_TopColor("TopColor", Color) = (1,1,1,1)
- _LiquidAmount("_Liquid Amount", Float) = 1
- _WorldLowestYPos("Liquid Bottom Y Pos", Float) = 0 //C#으로 부터 받은 가장 밑부분 vertex pos
- _BottleHeight("Bottle Height", Float) = 0
- _BottleWidth("Bottle Width", Float) = 0
- _WobbleX("WobbleX",Float) = 0
- _WobbleZ("WobbleZ",Float) = 0
- [Header(Rim)]
- _RimPower("Rim Power", Range(0.01, 2)) = 0.1
- [HDR]_RimColor("Rim Color", Color) = (1,1,1,1)
- _RimIntensity("Rim Intensity", Range(0.1, 100)) = 1
- [Header(Foam)]
- [HDR] _FoamColor("Foam Line Color", Color) = (1,1,1,1)
- _Line ("Foam Line Width", Range(0,3)) = 0.0
- _LineSmooth("Foam Line Smoothness", Range(0,3)) = 0.0
- _LineBk("Back Foam Width", Range(-2,0)) = 0
- }
- SubShader
- {
- Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" "Queue" = "Geometry" "DisableBatching" = "True"}
- Pass{
- Zwrite on
- Cull off
- AlphaToMask On //transparency ?
- HLSLPROGRAM
- #pragma vertex vert
- #pragma fragment frag
- #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
- #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
- #pragma target 3.0
- struct Attributes
- {
- float4 positionOS : POSITION;
- float3 normal : NORMAL;
- };
- struct Varyings
- {
- float4 positionHCS : SV_POSITION;
- float3 normal : NORMAL;
- float3 positionWS : TEXCOORD1;
- float3 liquidPosition : TEXCOORD2;
- float3 normalizedDirY : TEXCOORD3;
- float3 WSViewDir : TEXCOORD4;
- };
- half4 _TintColor;
- half4 _TopColor;
- float _LiquidAmount;
- float _WorldLowestYPos; //C#
- float _LocalObjectNormal; //C#
- float _BottleWidth =1;
- float _BottleHeight = 2;
- float3 _LocalYDir; //C#
- float _WobbleX, _WobbleZ;
- float _RimPower,_RimIntensity;
- half3 _RimColor;
- half4 _FoamColor;
- float _Line, _LineSmooth;
- float _WSPosY;
- float _LineBk;
- float3 Unity_RotateAboutAxis_Degrees(float3 In, float3 Axis, float Rotation)
- {
- Rotation = radians(Rotation);
- float s = sin(Rotation);
- float c = cos(Rotation);
- float one_minus_c = 1.0 - c;
- Axis = normalize(Axis);
- float3x3 rot_mat =
- { one_minus_c * Axis.x * Axis.x + c, one_minus_c * Axis.x * Axis.y - Axis.z * s, one_minus_c * Axis.z * Axis.x + Axis.y * s,
- one_minus_c * Axis.x * Axis.y + Axis.z * s, one_minus_c * Axis.y * Axis.y + c, one_minus_c * Axis.y * Axis.z - Axis.x * s,
- one_minus_c * Axis.z * Axis.x - Axis.y * s, one_minus_c * Axis.y * Axis.z + Axis.x * s, one_minus_c * Axis.z * Axis.z + c
- };
- float3 Out = mul(rot_mat, In);
- return Out;
- }
- Varyings vert (Attributes IN )
- {
- Varyings OUT;
- OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
- OUT.positionWS = TransformObjectToWorld(IN.positionOS.xyz);
- OUT.normalizedDirY = normalize(float3(0, IN.positionOS.y ,0));
- float3 positionWS = mul(unity_ObjectToWorld, IN.positionOS.xyz);
- OUT.normal = TransformObjectToWorldNormal(IN.normal.xyz);
- OUT.WSViewDir = normalize(_WorldSpaceCameraPos.xyz - OUT.positionWS.xyz);
- // pos = worldPos(mesh center.xyz의미) - transform.position - new Vector3(0, fillAmount, 0); //C#
- //rend.sharedMaterial.SetVector("_FillAmount", pos); //C#
- // float3 worldPos = mul (unity_ObjectToWorld, v.vertex.xyz);
- //float3 worldPosOffset = float3(worldPos.x, worldPos.y , worldPos.z) - _FillAmount;
- //float3 posWSX = Unity_RotateAboutAxis_Degrees(positionWS-IN.positionOS, float3(0,0,1), 90);
- //액체 회전 시키기 //변경하고자 하는 버텍스 포지션, 회전 기준 축 , 최대 각도 //90도로 해두어야 sin값을 곱했을 때 좌우 대칭으로 움직인다.
- //아니면 float3 (0,0,1)축을 음수버전을 만들어 주어야한다.
- float3 posWSX = Unity_RotateAboutAxis_Degrees(IN.positionOS, float3(0,0,1), 90); //IN.positionOS
- float3 posWSZ = Unity_RotateAboutAxis_Degrees(IN.positionOS, float3(1,0,0), 90);
- float3 worldPosAdjusted = OUT.positionWS + (posWSX * _WobbleX) + (posWSZ * _WobbleZ);
- float dotNormal = dot(OUT.WSViewDir, OUT.normal);
- OUT.liquidPosition = worldPosAdjusted; //-_LiquidAmount;
- if(dotNormal>=0)
- {
- OUT.normal = OUT.normal;
- }
- else
- {
- OUT.normal = float3(0,1,0);
- }
- return OUT;
- }
- half4 frag(Varyings IN, half facing:VFACE) : SV_Target
- {
- float3 worldYDir = float3(0,1,0);
- //물병과 world Y의 벌어진 각도 정도 float dotWorldContainer
- float dotWorldContainer =abs(dot(worldYDir.xyz, _LocalYDir.xyz));
- //bottle의 가로 높이 비율에 따라 눕혔을 때의 액체의 높이 조절
- float liquidHeight = lerp(_LiquidAmount * _BottleWidth/_BottleHeight, _LiquidAmount, dotWorldContainer); //min, max, 1-0 dot abs
- //액체 y 값
- float liquidPosition = IN.liquidPosition.y - liquidHeight; //IN.positionWS.y - _LiquidAmount;
- float cutoffTop = step(liquidPosition, _WorldLowestYPos);
- //--Rim Light --------------------------------------
- half face = saturate(dot(IN.WSViewDir, IN.normal));
- half3 rim = 1.0 - (pow(face, _RimPower));
- ///-------------------------------------------------
- //--foam--------------------------------------------
- float LineUpdate = lerp(_Line * _BottleWidth/_BottleHeight, _Line, dotWorldContainer);
- float LineSmooth = lerp(_LineSmooth * _BottleWidth/_BottleHeight, _Line, dotWorldContainer);
- float foam = smoothstep(_WSPosY - _Line - _LineSmooth, _WSPosY - _Line, liquidPosition); //liquidPosition
- float backfoam = smoothstep(_WSPosY-(_Line + _LineBk)-_LineSmooth, _WSPosY-(_Line+_LineBk),liquidPosition);
- ///-------------------------------------------------
- //물자르기 + 물 색
- half4 finalResult = _TintColor + foam *_FoamColor;//cutoffTop * _TintColor;
- finalResult.rgb += rim * _RimColor * _RimIntensity;
- //면 뒷(윗)면 색
- half4 topColor = _TopColor + backfoam;
- //topColor.rgb += rim * _RimColor * _RimIntensity;
- //자르기 alpha clip
- clip(cutoffTop-0.01);
- return facing > 0 ? finalResult : topColor;
- }
- ENDHLSL
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement