eye.chunk 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. #include <common/graph-expression/base>
  2. vec3 lerp_3Color(vec3 A, vec3 B, vec3 C, float alpha)
  3. {
  4. float alpha1 = saturate(alpha * 2.0);
  5. float alpha2 = saturate(alpha * 2.0 - 1.0);
  6. vec3 AB = lerp(A, B, alpha1);
  7. return lerp(AB, C, alpha2);
  8. }
  9. vec3 GetIrisUVMask(float IrisUVRadius)
  10. {
  11. const float IrisBorderWidth = 0.04, IrisBleedWidth = 0.035, IrisMaskWidth = 0.045;
  12. vec3 arg3_LimbusUVWidth = vec3(IrisBorderWidth, IrisBleedWidth, IrisMaskWidth);
  13. float arg8_IrisUVRadius = IrisUVRadius * 0.03 + 0.15;
  14. // vec3 out_IrisUVMask = Custom1(IrisUVRadius,UV,LimbusUVWidth)
  15. {
  16. float IrisUVRadiusTemp = arg8_IrisUVRadius;
  17. vec2 UV = FSInput_texcoord;
  18. vec3 LimbusUVWidth = arg3_LimbusUVWidth;
  19. UV = UV - vec2(0.5, 0.5);
  20. vec3 r = (vec3(length(UV)) - (vec3(IrisUVRadiusTemp) - LimbusUVWidth)) / LimbusUVWidth;
  21. return smoothstep(0.0, 1.0, saturate(vec3(1.0) - r));
  22. }
  23. }
  24. vec2 GetIrisUV(vec2 refractedUV, float IrisUVRadius, float PupilScale)
  25. {
  26. // code between Refract->Parallax, for control pupil size
  27. const float PupilShiftX = 0.0, PupilShiftY = 0.0, ScaleIrisWithinMask = 1.0;
  28. float uvRadius = (IrisUVRadius*0.03+0.15) * 2.0;
  29. vec2 UV1 = refractedUV - vec2(0.5);
  30. vec2 UV =(UV1 / uvRadius) + vec2(0.5);
  31. vec2 UVscaled;// = ScalePupils(UV,PupilScale1,PupilShiftX1,PupilShiftY1)
  32. {
  33. float ShiftMask = pow(saturate(-4.0 * (distance(vec2(0.5), UV) - 0.45)),0.7);
  34. vec2 UVshifted = UV + vec2(PupilShiftX * (ShiftMask * -0.1), PupilShiftY * (ShiftMask * 0.1));
  35. vec2 UVcentered = UVshifted - vec2(0.5, 0.5);
  36. float UVlength = length(UVcentered);
  37. // UV on circle at distance 0.5 from the center, in direction of original UV
  38. vec2 UVmax = normalize(UVcentered) * 0.5;
  39. UVscaled = lerp(UVmax, vec2(0.0, 0.0), saturate((1.0 - UVlength * 2.0) * PupilScale)) + vec2(0.5, 0.5);
  40. }
  41. float TextureScale = ScaleIrisWithinMask;
  42. vec2 UVs_out;// = ScaleUVsByCenter(UVscaled,TextureScale)
  43. {
  44. UVs_out = (UVscaled - vec2(0.5)) * TextureScale + vec2(0.5);
  45. }
  46. return UVs_out;
  47. }
  48. vec3 GetGeneratedColorForIris(vec2 irisUV, sampler2D irisColorMap, float IrisColor1U, float IrisColor2U, float IrisColor1Bright, float IrisColor2Bright)
  49. {
  50. //MF_irisGenerator
  51. // custom pupil spherical scaling, should after refraction
  52. /* vec2 centeredUV = (irisUV - vec2(0.5)) * 2.0;
  53. float lengthUV = length(centeredUV);
  54. vec2 dirUV = normalize(centeredUV);
  55. irisUV = pow(lengthUV, pupilScale) * dirUV * 0.5 + vec2(0.5);
  56. */
  57. const float IrisColor1V = 0.3, IrisColor2V = 0.3, IrisColorValueVariation = 0.25, IrisColorHueVariation = 0.1;
  58. const float IrisColorBalance = 0.5, IrisColorBalanceSmoothness = 0.5, IrisSaturationVariation = 0.25;
  59. const float RadialStructuralBlendSwitch = 0.0, LimbusDarkAmount = 0.5, AOinIris = 0.7;
  60. vec4 M_Tex = texture(irisColorMap/*T_Iris_A_M*/, irisUV);
  61. vec2 uv1 = vec2(IrisColor2U - IrisColorHueVariation, IrisColor2V + IrisColorValueVariation);
  62. vec2 uv2 = vec2(IrisColor2U + IrisColorHueVariation, IrisColor2V - IrisColorHueVariation);
  63. vec2 uv3 = vec2(IrisColor1U - IrisColorHueVariation, IrisColor1V + IrisColorValueVariation);
  64. vec2 uv4 = vec2(IrisColor1U + IrisColorHueVariation, IrisColor1V - IrisColorValueVariation);
  65. vec3 col2 = SRGBToLinear(texture(irisGradientMap, vec2(IrisColor2U, IrisColor2V)).rgb) * IrisColor2Bright;
  66. vec3 col2_hue1 = SRGBToLinear(texture(irisGradientMap, uv1).rgb) * IrisColor2Bright;
  67. vec3 col2_hue2 = SRGBToLinear(texture(irisGradientMap, uv2).rgb) * IrisColor2Bright;
  68. vec3 col1 = SRGBToLinear(texture(irisGradientMap, vec2(IrisColor1U, IrisColor1V)).rgb) * IrisColor1Bright;
  69. vec3 col1_hue1 = SRGBToLinear(texture(irisGradientMap, uv3).rgb) * IrisColor1Bright;
  70. vec3 col1_hue2 = SRGBToLinear(texture(irisGradientMap, uv4).rgb) * IrisColor1Bright;
  71. float minValue = IrisColorBalance - IrisColorBalanceSmoothness;
  72. float maxValue = IrisColorBalance + IrisColorBalanceSmoothness;
  73. vec2 invMaskRB = vec2(1.0) - M_Tex.rb;
  74. vec2 alphaRB = smoothstep(minValue, maxValue, invMaskRB);
  75. float Fraction = lerp(-1.0, 1.0, M_Tex.r) * IrisSaturationVariation;
  76. vec3 desat_col1 = Desaturation(lerp_3Color(col1_hue2, col1, col1_hue1, M_Tex.r), Fraction);
  77. vec3 desat_col2 = Desaturation(lerp_3Color(col2_hue2, col2, col2_hue1, M_Tex.r), Fraction);
  78. vec3 b = lerp(desat_col2, desat_col1, alphaRB.x);
  79. vec3 a = lerp(desat_col2, desat_col1, alphaRB.y);
  80. vec3 lerpedColor = lerp(a, b, RadialStructuralBlendSwitch) * M_Tex.a;
  81. vec3 base = lerpedColor * lerp(1.0, M_Tex.g, AOinIris);
  82. float radius = distance(irisUV - vec2(0.5), vec2(0.0));
  83. float alpha = smoothstep(0.275, 0.5, radius);
  84. return lerp(base, pow(base, vec3(LimbusDarkAmount + 1.0)), alpha);
  85. }
  86. vec3 GetBlendColorForIrisAndSclera(vec3 irisUVMask, vec3 irisGeneratedColor, sampler2D irisHeightMapAlpha, sampler2D scleraDiffuse, sampler2D T_Veins_D, vec3 scleraTintColor, float VeinsPower, float scleraBright)
  87. {
  88. const float ScleraCornerDarkRadius = 0.6, ScleraCornerDarkHardness = 0.4, ScleraBrightness = 0.5, ScleraPower = 1.0, ScleraTintU = 0.2, ScleraTintV = 0.2, ScleraRotate = 0.0;
  89. const float VeinsRotate = 0.0, IrisBrightness = 1.0, IrisSaturation = 0.5, CloudyIrisRadius = 0.13, CloudyIrisHardness = 0.0;
  90. const vec4 ScleraCornerDarkColor = vec4(0.745,0.213,0.237,1), IrisBleedTint = vec4(1.0,1.0,1.0,1.0), CloudyIrisColor = vec4(0.009684,0.011247,0.015625,1.0);
  91. float heightAlpha = texture(irisHeightMapAlpha, FSInput_texcoord).r;
  92. vec2 scleraUV = Rotator(FSInput_texcoord, vec2(0.5,0.5), heightAlpha * ScleraRotate, 6.283);
  93. vec2 veinsUV = Rotator(FSInput_texcoord, vec2(0.5,0.5), heightAlpha * VeinsRotate, 6.283);
  94. vec3 scleraTexColor = SRGBToLinear(texture(/*T_Sclera_D*/scleraDiffuse, scleraUV).rgb) * scleraBright;
  95. vec3 veinsTexColor = SRGBToLinear(texture(T_Veins_D, veinsUV).rgb) * scleraBright;
  96. // use fixed color for optimizing, scleraTintColor = texture(T_sclera_tint_picker, vec2(ScleraTintU,ScleraTintV)).rgb;
  97. vec3 scleraColor = pow(scleraTexColor, vec3(ScleraPower))*ScleraBrightness*1.1 + vec3(0.8);
  98. scleraColor *= scleraTintColor;
  99. vec3 bleededScleraColor = lerp(scleraColor, IrisBleedTint.rgb * scleraColor, irisUVMask.g);
  100. vec3 veinsColor = pow(veinsTexColor, vec3(VeinsPower));
  101. vec3 ScleraColor = bleededScleraColor * veinsColor;
  102. vec3 irisColor = Desaturation(irisGeneratedColor * IrisBrightness, (IrisSaturation - 0.5) * -2.0);
  103. vec3 lerpedScleraAndIris = lerp(ScleraColor, irisColor, irisUVMask.r);
  104. vec3 cloudyPupilAddColor = SphereMask(FSInput_texcoord, vec2(0.5), CloudyIrisRadius, CloudyIrisHardness) * CloudyIrisColor.rgb;
  105. float scleraCornerDarkMask = SphereMask(FSInput_texcoord, vec2(0.5), ScleraCornerDarkRadius, ScleraCornerDarkHardness);
  106. vec3 ScleraCorner = lerp(ScleraCornerDarkColor.rgb, vec3(1.0), scleraCornerDarkMask);
  107. vec3 BaseColor = ScleraCorner * (cloudyPupilAddColor + lerpedScleraAndIris);
  108. return BaseColor;
  109. }
  110. // unused
  111. // out_RefractedUV = GetRefractedUV(out_IrisUVMask, irisHeightMap, irisNormalMap, viewDir, IrisUVRadius, CONREAL_IOR);
  112. vec2 GetRefractedUV(vec3 irisUVMask, sampler2D irisHeightMap, sampler2D T_Eye_N, vec3 viewDir, float IrisUVRadius, float internalIoR)
  113. {
  114. const float RefractionDepthScale = 1.2;
  115. vec3 normalW = normalize(FSInput_worldNormal), cameraW = viewDir;
  116. vec3 RefractionDirection;
  117. // RefractionDirection = custom2(internalloR,normalW,cameraW)
  118. {
  119. float n = internalIoR;
  120. float facing = dot(normalW, cameraW);
  121. float w = n * facing;
  122. float k = sqrt(1.0+(w-n)*(w+n));
  123. vec3 t;
  124. t = (w - k)*normalW - n*cameraW;
  125. t = normalize(t);
  126. RefractionDirection = -t;
  127. }
  128. float arg8_IrisUVRadius = IrisUVRadius * 0.03 + 0.15;
  129. vec2 arg2_UV = FSInput_texcoord;
  130. float arg4_DepthScale = RefractionDepthScale;
  131. float arg5_DepthPlaneOffset = SampleTextureExr(irisHeightMap, vec2(arg8_IrisUVRadius + 0.5, 0.5)).r;
  132. vec3 arg6_MidPlaneDisplacement = SampleTextureExr(irisHeightMap, FSInput_texcoord).rgb;
  133. vec3 arg7_EyeDirectionWorld = TransformNormalMap(texture(T_Eye_N, FSInput_texcoord).rgb);
  134. vec3 a5 = max(arg6_MidPlaneDisplacement - arg5_DepthPlaneOffset, vec3(0.0)) * arg4_DepthScale;
  135. float b5 = lerp(0.325, 1.0, dot(cameraW,arg7_EyeDirectionWorld) * dot(cameraW,arg7_EyeDirectionWorld));
  136. vec3 heightW = a5 / b5;
  137. vec3 b3 = RefractionDirection*heightW;
  138. vec3 tangent = normalize(FSInput_worldTangent);
  139. vec3 a3 = normalize(tangent - dot(tangent, arg7_EyeDirectionWorld) * arg7_EyeDirectionWorld);
  140. vec3 a4 = cross(a3,arg7_EyeDirectionWorld);
  141. vec3 b4 = b3;
  142. vec2 b2 = vec2(dot(a3,b3),dot(a4,b4));
  143. // float VectorLength = distance(vec2(0.0), vec2(arg8_IrisUVRadius*vec2(-1.0,1.0)*b2));
  144. // float out_Transparency = VectorLength - arg8_IrisUVRadius;
  145. vec2 a1 = arg2_UV;
  146. vec2 b1 = vec2(arg8_IrisUVRadius) * vec2(-1.0,1.0)*b2 + arg2_UV;
  147. float alpha1 = irisUVMask.r;
  148. return lerp(a1,b1,alpha1);
  149. }