You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
256 lines
5.6 KiB
HLSL
256 lines
5.6 KiB
HLSL
/******************************************************************************/
|
|
/*
|
|
Project - MudBun
|
|
Publisher - Long Bunny Labs
|
|
http://LongBunnyLabs.com
|
|
Author - Ming-Lun "Allen" Chou
|
|
http://AllenChou.net
|
|
*/
|
|
/******************************************************************************/
|
|
|
|
#ifndef MUDBUN_SHADER_COMMON
|
|
#define MUDBUN_SHADER_COMMON
|
|
|
|
#include "../Math/Codec.cginc"
|
|
#include "../Math/MathConst.cginc"
|
|
#include "../Math/Vector.cginc"
|
|
#include "../Noise/RandomNoise.cginc"
|
|
|
|
#if defined(SHADER_API_D3D11) || defined(SHADER_API_VULKAN) || defined(SHADER_API_GLCORE) || defined(SHADER_API_GLES) || defined(SHADER_API_GLES3) || defined(SHADER_API_METAL)
|
|
#define MUDBUN_VALID (1)
|
|
#endif
|
|
|
|
#ifdef MUDBUN_VALID
|
|
#include "../Noise/ClassicNoise3D.cginc"
|
|
#include "../Noise/SimplexNoise3D.cginc"
|
|
#endif
|
|
|
|
#ifdef SHADERPASS // HDRP & URP
|
|
#if SHADERPASS == SHADERPASS_SHADOWS && !defined(SHADERPASS_SHADOWCASTER)
|
|
#define SHADERPASS_SHADOWCASTER
|
|
#define MUDBUN_SHADOW_PASS
|
|
#endif
|
|
#endif
|
|
|
|
#if defined(UNITY_PASS_SHADOWCASTER) && !defined(SHADERPASS_SHADOWCASTER) // built-in RP
|
|
#define SHADERPASS_SHADOWCASTER
|
|
#define MUDBUN_SHADOW_PASS
|
|
#endif
|
|
|
|
int enable2dMode;
|
|
int splatNormalsMatchCameraFacing;
|
|
int splatShadowsMatchCameraFacing;
|
|
|
|
float4 _Color;
|
|
float4 _Emission;
|
|
#ifndef MUDBUN_URP_TEMPLATE
|
|
float _Metallic;
|
|
float _Smoothness;
|
|
#endif
|
|
|
|
#ifdef MUDBUN_BUILT_IN_RP
|
|
float _AlphaCutoutThreshold;
|
|
float _Dithering;
|
|
int _RandomDither;
|
|
|
|
sampler2D _DitherTexture;
|
|
int _DitherTextureSize;
|
|
|
|
int _UseTex0;
|
|
sampler2D _MainTex;
|
|
float4 _MainTex_ST;
|
|
int _MainTexX;
|
|
int _MainTexY;
|
|
int _MainTexZ;
|
|
|
|
int _UseTex1;
|
|
sampler2D _Tex1;
|
|
float4 _Tex1_ST;
|
|
int _Tex1X;
|
|
int _Tex1Y;
|
|
int _Tex1Z;
|
|
|
|
int _UseTex2;
|
|
sampler2D _Tex2;
|
|
float4 _Tex2_ST;
|
|
int _Tex2X;
|
|
int _Tex2Y;
|
|
int _Tex2Z;
|
|
|
|
int _UseTex3;
|
|
sampler2D _Tex3;
|
|
float4 _Tex3_ST;
|
|
int _Tex3X;
|
|
int _Tex3Y;
|
|
int _Tex3Z;
|
|
|
|
int _UseNorm0;
|
|
sampler2D _MainNorm;
|
|
float4 _MainNorm_ST;
|
|
int _MainNormX;
|
|
int _MainNormY;
|
|
int _MainNormZ;
|
|
|
|
int _UseNorm1;
|
|
sampler2D _Norm1;
|
|
float4 _Norm1_ST;
|
|
int _Norm1X;
|
|
int _Norm1Y;
|
|
int _Norm1Z;
|
|
|
|
int _UseNorm2;
|
|
sampler2D _Norm2;
|
|
float4 _Norm2_ST;
|
|
int _Norm2X;
|
|
int _Norm2Y;
|
|
int _Norm2Z;
|
|
|
|
int _UseNorm3;
|
|
sampler2D _Norm3;
|
|
float4 _Norm3_ST;
|
|
int _Norm3X;
|
|
int _Norm3Y;
|
|
int _Norm3Z;
|
|
#endif
|
|
|
|
int scaleSign;
|
|
float splatSize;
|
|
float splatSizeJitter;
|
|
float splatNormalShift;
|
|
float splatNormalShiftJitter;
|
|
float splatColorJitter;
|
|
float splatPositionJitter;
|
|
float splatRotationJitter;
|
|
float splatOrientationJitter;
|
|
float splatOriginalNormalBlend;
|
|
float splatJitterNoisiness;
|
|
float splatCameraFacing;
|
|
float splatScreenSpaceFlattening;
|
|
//float splatSmoothNormalBlend;
|
|
|
|
float4x4 localToWorld;
|
|
float4x4 localToWorldIt;
|
|
float4 localToWorldScale;
|
|
float4x4 worldToLocal;
|
|
float4x4 worldToLocalIt;
|
|
|
|
struct Vertex
|
|
{
|
|
float4 vertex : POSITION;
|
|
float3 normal : NORMAL;
|
|
float4 tangent : TANGENT;
|
|
float4 color : COLOR;
|
|
float4 texcoord1 : TEXCOORD1;
|
|
float4 texcoord2 : TEXCOORD2;
|
|
uint id : SV_VertexID;
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
UNITY_VERTEX_OUTPUT_STEREO
|
|
};
|
|
|
|
#ifndef SHADER_GRAPH
|
|
struct Input
|
|
{
|
|
float2 tex : TEXCOORD0;
|
|
float4 color : COLOR;
|
|
float4 tangent : TANGENT;
|
|
float4 emissionHash : TEXCOORD3;
|
|
float2 metallicSmoothness : TEXCOORD4;
|
|
float4 texWeight : TEXCOORD5;
|
|
float3 localPos : TEXCOORD6;
|
|
float3 localNorm : TEXCOORD7;
|
|
float4 screenPos;
|
|
};
|
|
#endif
|
|
|
|
void computeOpaqueTransparency
|
|
(
|
|
float2 screenPos,
|
|
float3 pos,
|
|
float hash,
|
|
sampler2D ditherTexture,
|
|
int ditherTextureSize,
|
|
bool useRandomDither,
|
|
float alphaCutoutThreshold,
|
|
float ditheringBlend,
|
|
inout float alpha,
|
|
out float alphaThreshold
|
|
)
|
|
{
|
|
alpha = saturate(1.02f * (alpha - 0.5f) + 0.5f);
|
|
|
|
float ditherThreshold = 0.0f;
|
|
if (useRandomDither > 0)
|
|
{
|
|
ditherThreshold = mbn_rand(pos);
|
|
}
|
|
else
|
|
{
|
|
ditherThreshold = tex2D(ditherTexture, screenPos / ditherTextureSize).r;
|
|
}
|
|
|
|
ditherThreshold = 0.98f * (ditherThreshold - 0.5f) + 0.5f;
|
|
|
|
alphaThreshold = lerp(alphaCutoutThreshold, max(alphaCutoutThreshold, ditherThreshold), ditheringBlend);
|
|
}
|
|
|
|
float4 tex2D_triplanar
|
|
(
|
|
sampler2D tex,
|
|
float4 texSt,
|
|
float3 weight,
|
|
float3 localPos,
|
|
bool projectX,
|
|
bool projectY,
|
|
bool projectZ
|
|
)
|
|
{
|
|
float4 color = 0.0f;
|
|
float totalWeight = 0.0f;
|
|
if (projectX)
|
|
{
|
|
color += tex2D(tex, localPos.yz * texSt.xy + texSt.zw) * weight.x;
|
|
totalWeight += weight.x;
|
|
}
|
|
if (projectY)
|
|
{
|
|
color += tex2D(tex, localPos.zx * texSt.xy + texSt.zw) * weight.y;
|
|
totalWeight += weight.y;
|
|
}
|
|
if (projectZ)
|
|
{
|
|
color += tex2D(tex, localPos.xy * texSt.xy + texSt.zw) * weight.z;
|
|
totalWeight += weight.z;
|
|
}
|
|
|
|
if (totalWeight <= 0.0f)
|
|
return 1.0f;
|
|
|
|
return color / totalWeight;
|
|
}
|
|
|
|
float3 compute_tangent(float3 normal)
|
|
{
|
|
const float kTangentFallbackBlendDist = 0.3f;
|
|
const float kTangentFallbackBlendDistComp = 1.0f - kTangentFallbackBlendDist;
|
|
|
|
float normalAbsY = abs(normal.y);
|
|
float3 tangentDefault = cross(normal, kUnitY);
|
|
float3 tangentFallback = sign(normal.y) * cross(normal, kUnitZ);
|
|
|
|
float3 tangent = (normalAbsY < kTangentFallbackBlendDistComp) ? tangentDefault : tangentFallback;
|
|
if (normalAbsY > 0.0001f)
|
|
tangent = lerp(tangentDefault, tangentFallback, saturate((normalAbsY - kTangentFallbackBlendDistComp) / kTangentFallbackBlendDist));
|
|
|
|
return normalize(tangent);
|
|
}
|
|
|
|
inline float3 gamma_to_linear_space(float3 sRGB)
|
|
{
|
|
// Approximate version from http://chilliant.blogspot.com.au/2012/08/srgb-approximations-for-hlsl.html?m=1
|
|
return sRGB * (sRGB * (sRGB * 0.305306011f + 0.682171111f) + 0.012522878f);
|
|
}
|
|
|
|
#endif
|
|
|