KYJxierang/Assets/Extractive_Industry_2/Shaders/Main.shader
2024-12-22 23:07:46 +08:00

269 lines
10 KiB
GLSL
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Made with Amplify Shader Editor v1.9.2.2
// Available at the Unity Asset Store - http://u3d.as/y3X
Shader "Main"
{
Properties
{
_Texture("Texture", 2D) = "white" {}
_Metallic("Metallic", Range( 0 , 1)) = 0
_Rough("Rough", Range( 0 , 1)) = 0
_HSV("HSV", Vector) = (1,1,1,0)
_Lighten("Lighten", Range( 0 , 0.2)) = 0
[Toggle]_UsePattern("Use Pattern", Float) = 0
_Pattern("Pattern", 2D) = "white" {}
_PatternBlend("Pattern Blend", Float) = 0
_PatternScale("Pattern Scale", Float) = 1
_PatternNormalStr("Pattern Normal Str", Float) = 0
_DistortionScale("Distortion Scale", Float) = 0
_DistortionStr("Distortion Str", Range( -1 , 1)) = 0
_Gradient("Gradient", Range( -1 , 1)) = 0
[HideInInspector] _texcoord( "", 2D ) = "white" {}
[HideInInspector] __dirty( "", Int ) = 1
}
SubShader
{
Tags{ "RenderType" = "Opaque" "Queue" = "Geometry+0" }
Cull Back
CGINCLUDE
#include "UnityShaderVariables.cginc"
#include "UnityPBSLighting.cginc"
#include "Lighting.cginc"
#pragma target 3.0
#ifdef UNITY_PASS_SHADOWCASTER
#undef INTERNAL_DATA
#undef WorldReflectionVector
#undef WorldNormalVector
#define INTERNAL_DATA half3 internalSurfaceTtoW0; half3 internalSurfaceTtoW1; half3 internalSurfaceTtoW2;
#define WorldReflectionVector(data,normal) reflect (data.worldRefl, half3(dot(data.internalSurfaceTtoW0,normal), dot(data.internalSurfaceTtoW1,normal), dot(data.internalSurfaceTtoW2,normal)))
#define WorldNormalVector(data,normal) half3(dot(data.internalSurfaceTtoW0,normal), dot(data.internalSurfaceTtoW1,normal), dot(data.internalSurfaceTtoW2,normal))
#endif
struct Input
{
float3 worldPos;
float3 worldNormal;
INTERNAL_DATA
float2 uv_texcoord;
};
uniform sampler2D _Pattern;
uniform float _DistortionScale;
uniform float _DistortionStr;
uniform float _PatternScale;
uniform float _PatternNormalStr;
uniform float _UsePattern;
uniform sampler2D _Texture;
uniform float4 _Texture_ST;
uniform float3 _HSV;
uniform float _Lighten;
uniform float _PatternBlend;
uniform float _Gradient;
uniform float _Metallic;
uniform float _Rough;
float3 mod2D289( float3 x ) { return x - floor( x * ( 1.0 / 289.0 ) ) * 289.0; }
float2 mod2D289( float2 x ) { return x - floor( x * ( 1.0 / 289.0 ) ) * 289.0; }
float3 permute( float3 x ) { return mod2D289( ( ( x * 34.0 ) + 1.0 ) * x ); }
float snoise( float2 v )
{
const float4 C = float4( 0.211324865405187, 0.366025403784439, -0.577350269189626, 0.024390243902439 );
float2 i = floor( v + dot( v, C.yy ) );
float2 x0 = v - i + dot( i, C.xx );
float2 i1;
i1 = ( x0.x > x0.y ) ? float2( 1.0, 0.0 ) : float2( 0.0, 1.0 );
float4 x12 = x0.xyxy + C.xxzz;
x12.xy -= i1;
i = mod2D289( i );
float3 p = permute( permute( i.y + float3( 0.0, i1.y, 1.0 ) ) + i.x + float3( 0.0, i1.x, 1.0 ) );
float3 m = max( 0.5 - float3( dot( x0, x0 ), dot( x12.xy, x12.xy ), dot( x12.zw, x12.zw ) ), 0.0 );
m = m * m;
m = m * m;
float3 x = 2.0 * frac( p * C.www ) - 1.0;
float3 h = abs( x ) - 0.5;
float3 ox = floor( x + 0.5 );
float3 a0 = x - ox;
m *= 1.79284291400159 - 0.85373472095314 * ( a0 * a0 + h * h );
float3 g;
g.x = a0.x * x0.x + h.x * x0.y;
g.yz = a0.yz * x12.xz + h.yz * x12.yw;
return 130.0 * dot( m, g );
}
float3 PerturbNormal107_g2( float3 surf_pos, float3 surf_norm, float height, float scale )
{
// "Bump Mapping Unparametrized Surfaces on the GPU" by Morten S. Mikkelsen
float3 vSigmaS = ddx( surf_pos );
float3 vSigmaT = ddy( surf_pos );
float3 vN = surf_norm;
float3 vR1 = cross( vSigmaT , vN );
float3 vR2 = cross( vN , vSigmaS );
float fDet = dot( vSigmaS , vR1 );
float dBs = ddx( height );
float dBt = ddy( height );
float3 vSurfGrad = scale * 0.05 * sign( fDet ) * ( dBs * vR1 + dBt * vR2 );
return normalize ( abs( fDet ) * vN - vSurfGrad );
}
float3 HSVToRGB( float3 c )
{
float4 K = float4( 1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0 );
float3 p = abs( frac( c.xxx + K.xyz ) * 6.0 - K.www );
return c.z * lerp( K.xxx, saturate( p - K.xxx ), c.y );
}
float3 RGBToHSV(float3 c)
{
float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
float4 p = lerp( float4( c.bg, K.wz ), float4( c.gb, K.xy ), step( c.b, c.g ) );
float4 q = lerp( float4( p.xyw, c.r ), float4( c.r, p.yzx ), step( p.x, c.r ) );
float d = q.x - min( q.w, q.y );
float e = 1.0e-10;
return float3( abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);
}
void surf( Input i , inout SurfaceOutputStandard o )
{
float3 ase_worldPos = i.worldPos;
float3 surf_pos107_g2 = ase_worldPos;
float3 ase_worldNormal = WorldNormalVector( i, float3( 0, 0, 1 ) );
float3 surf_norm107_g2 = ase_worldNormal;
float simplePerlin2D153 = snoise( ase_worldPos.xy*_DistortionScale );
simplePerlin2D153 = simplePerlin2D153*0.5 + 0.5;
float temp_output_159_0 = ( simplePerlin2D153 * _DistortionStr );
float3 ase_vertexNormal = mul( unity_WorldToObject, float4( ase_worldNormal, 0 ) );
ase_vertexNormal = normalize( ase_vertexNormal );
float lerpResult57 = lerp( tex2D( _Pattern, ( (( ase_worldPos + temp_output_159_0 )).xy * _PatternScale ) ).r , tex2D( _Pattern, ( (( ase_worldPos + temp_output_159_0 )).xz * _PatternScale ) ).r , abs( ase_vertexNormal.y ));
float lerpResult60 = lerp( lerpResult57 , tex2D( _Pattern, ( (( ase_worldPos + temp_output_159_0 )).yz * _PatternScale ) ).r , abs( ase_vertexNormal.x ));
float height107_g2 = lerpResult60;
float scale107_g2 = _PatternNormalStr;
float3 localPerturbNormal107_g2 = PerturbNormal107_g2( surf_pos107_g2 , surf_norm107_g2 , height107_g2 , scale107_g2 );
float3 ase_worldTangent = WorldNormalVector( i, float3( 1, 0, 0 ) );
float3 ase_worldBitangent = WorldNormalVector( i, float3( 0, 1, 0 ) );
float3x3 ase_worldToTangent = float3x3( ase_worldTangent, ase_worldBitangent, ase_worldNormal );
float3 worldToTangentDir42_g2 = mul( ase_worldToTangent, localPerturbNormal107_g2);
o.Normal = worldToTangentDir42_g2;
float3 ase_vertex3Pos = mul( unity_WorldToObject, float4( i.worldPos , 1 ) );
float3 temp_cast_1 = (saturate( ase_vertex3Pos.y )).xxx;
float3 temp_cast_2 = (ase_vertexNormal.y).xxx;
float2 uv_Texture = i.uv_texcoord * _Texture_ST.xy + _Texture_ST.zw;
float3 hsvTorgb2_g3 = RGBToHSV( tex2D( _Texture, uv_Texture ).rgb );
float3 break8_g3 = _HSV;
float3 hsvTorgb6_g3 = HSVToRGB( float3(( hsvTorgb2_g3.x * break8_g3.x ),( hsvTorgb2_g3.y * break8_g3.y ),( hsvTorgb2_g3.z * break8_g3.z )) );
float3 blendOpSrc43 = temp_cast_2;
float3 blendOpDest43 = hsvTorgb6_g3;
float3 lerpBlendMode43 = lerp(blendOpDest43, max( blendOpSrc43, blendOpDest43 ),_Lighten);
float3 temp_output_43_0 = ( saturate( lerpBlendMode43 ));
float3 temp_cast_4 = (lerpResult60).xxx;
float3 blendOpSrc103 = temp_cast_4;
float3 blendOpDest103 = temp_output_43_0;
float3 lerpBlendMode103 = lerp(blendOpDest103,2.0f*blendOpDest103*blendOpSrc103 + blendOpDest103*blendOpDest103*(1.0f - 2.0f*blendOpSrc103),_PatternBlend);
float3 blendOpSrc170 = temp_cast_1;
float3 blendOpDest170 = (( _UsePattern )?( ( saturate( lerpBlendMode103 )) ):( temp_output_43_0 ));
float3 lerpBlendMode170 = lerp(blendOpDest170,( blendOpSrc170 * blendOpDest170 ),_Gradient);
o.Albedo = ( saturate( lerpBlendMode170 ));
o.Metallic = _Metallic;
o.Smoothness = ( 1.0 - _Rough );
o.Alpha = 1;
}
ENDCG
CGPROGRAM
#pragma surface surf Standard keepalpha fullforwardshadows
ENDCG
Pass
{
Name "ShadowCaster"
Tags{ "LightMode" = "ShadowCaster" }
ZWrite On
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 3.0
#pragma multi_compile_shadowcaster
#pragma multi_compile UNITY_PASS_SHADOWCASTER
#pragma skip_variants FOG_LINEAR FOG_EXP FOG_EXP2
#include "HLSLSupport.cginc"
#if ( SHADER_API_D3D11 || SHADER_API_GLCORE || SHADER_API_GLES || SHADER_API_GLES3 || SHADER_API_METAL || SHADER_API_VULKAN )
#define CAN_SKIP_VPOS
#endif
#include "UnityCG.cginc"
#include "Lighting.cginc"
#include "UnityPBSLighting.cginc"
struct v2f
{
V2F_SHADOW_CASTER;
float2 customPack1 : TEXCOORD1;
float4 tSpace0 : TEXCOORD2;
float4 tSpace1 : TEXCOORD3;
float4 tSpace2 : TEXCOORD4;
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
};
v2f vert( appdata_full v )
{
v2f o;
UNITY_SETUP_INSTANCE_ID( v );
UNITY_INITIALIZE_OUTPUT( v2f, o );
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO( o );
UNITY_TRANSFER_INSTANCE_ID( v, o );
Input customInputData;
float3 worldPos = mul( unity_ObjectToWorld, v.vertex ).xyz;
half3 worldNormal = UnityObjectToWorldNormal( v.normal );
half3 worldTangent = UnityObjectToWorldDir( v.tangent.xyz );
half tangentSign = v.tangent.w * unity_WorldTransformParams.w;
half3 worldBinormal = cross( worldNormal, worldTangent ) * tangentSign;
o.tSpace0 = float4( worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x );
o.tSpace1 = float4( worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y );
o.tSpace2 = float4( worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z );
o.customPack1.xy = customInputData.uv_texcoord;
o.customPack1.xy = v.texcoord;
TRANSFER_SHADOW_CASTER_NORMALOFFSET( o )
return o;
}
half4 frag( v2f IN
#if !defined( CAN_SKIP_VPOS )
, UNITY_VPOS_TYPE vpos : VPOS
#endif
) : SV_Target
{
UNITY_SETUP_INSTANCE_ID( IN );
Input surfIN;
UNITY_INITIALIZE_OUTPUT( Input, surfIN );
surfIN.uv_texcoord = IN.customPack1.xy;
float3 worldPos = float3( IN.tSpace0.w, IN.tSpace1.w, IN.tSpace2.w );
half3 worldViewDir = normalize( UnityWorldSpaceViewDir( worldPos ) );
surfIN.worldPos = worldPos;
surfIN.worldNormal = float3( IN.tSpace0.z, IN.tSpace1.z, IN.tSpace2.z );
surfIN.internalSurfaceTtoW0 = IN.tSpace0.xyz;
surfIN.internalSurfaceTtoW1 = IN.tSpace1.xyz;
surfIN.internalSurfaceTtoW2 = IN.tSpace2.xyz;
SurfaceOutputStandard o;
UNITY_INITIALIZE_OUTPUT( SurfaceOutputStandard, o )
surf( surfIN, o );
#if defined( CAN_SKIP_VPOS )
float2 vpos = IN.pos;
#endif
SHADOW_CASTER_FRAGMENT( IN )
}
ENDCG
}
}
Fallback "Diffuse"
CustomEditor "ASEMaterialInspector"
}
/*
Сontacts of the author who created this shader:
https://vk.com/maximlm_3d
https://gamedev.ru/job/forum/?id=268969
https://www.artstation.com/lapshin
*/