Files
KopMap/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview.cginc
2025-04-03 02:30:16 +08:00

121 lines
3.1 KiB
HLSL

#ifndef PREVIEW_INCLUDED
#define PREVIEW_INCLUDED
#include "UnityCG.cginc"
float3 preview_WorldSpaceCameraPos;
float4x4 preview_WorldToObject;
float4x4 preview_ObjectToWorld;
float4x4 preview_MatrixV;
float4x4 preview_MatrixInvV;
inline float3 PreviewFragmentPositionOS( float2 uv )
{
float2 xy = 2 * uv - 1;
float z = -sqrt( 1 - saturate( dot( xy, xy ) ) );
return float3( xy, z );
}
inline float3 PreviewFragmentNormalOS( float2 uv, bool normalized = true )
{
float3 positionOS = PreviewFragmentPositionOS( uv );
float3 normalOS = positionOS;
if ( normalized )
{
normalOS = normalize( normalOS );
}
return normalOS;
}
inline float3 PreviewFragmentTangentOS( float2 uv, bool normalized = true )
{
float3 positionOS = PreviewFragmentPositionOS( uv );
float3 tangentOS = float3( -positionOS.z, positionOS.y * 0.01, positionOS.x );
if ( normalized )
{
tangentOS = normalize( tangentOS );
}
return tangentOS;
}
inline float3 PreviewWorldSpaceViewDir( in float3 worldPos, bool normalized )
{
float3 vec = preview_WorldSpaceCameraPos.xyz - worldPos;
if ( normalized )
{
vec = normalize( vec );
}
return vec;
}
inline float3 PreviewWorldToObjectDir( in float3 dir, const bool normalized )
{
float3 vec = mul( ( float3x3 )preview_WorldToObject, dir );
if ( normalized )
{
vec = normalize( vec );
}
return vec;
}
inline float3 PreviewObjectToWorldDir( in float3 dir, const bool normalized )
{
float3 vec = mul( ( float3x3 )preview_ObjectToWorld, dir );
if ( normalized )
{
vec = normalize( vec );
}
return vec;
}
inline float3 PreviewWorldToViewDir( in float3 dir, const bool normalized )
{
float3 vec = mul( ( float3x3 )preview_MatrixV, dir );
if ( normalized )
{
vec = normalize( vec );
}
return vec;
}
inline float3 PreviewViewToWorldDir( in float3 dir, const bool normalized )
{
float3 vec = mul( ( float3x3 )preview_MatrixInvV, dir );
if ( normalized )
{
vec = normalize( vec );
}
return vec;
}
float3 PreviewFragmentTangentToWorldDir( in float2 uv, in float3 normalTS, const bool normalized )
{
float3 vertexPos = PreviewFragmentPositionOS( uv );
float3 tangent = PreviewFragmentTangentOS( uv );
float3 worldPos = mul( unity_ObjectToWorld, float4( vertexPos, 1 ) ).xyz;
float3 normal = PreviewFragmentNormalOS( uv );
float3 worldNormal = UnityObjectToWorldNormal( normal );
float3 worldTangent = UnityObjectToWorldDir( tangent );
const float tangentSign = -1;
float3 worldBinormal = normalize( cross( worldNormal, worldTangent ) * tangentSign );
float4 tSpace0 = float4( worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x );
float4 tSpace1 = float4( worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y );
float4 tSpace2 = float4( worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z );
float3 vec = float3( dot( tSpace0.xyz, normalTS ), dot( tSpace1.xyz, normalTS ), dot( tSpace2.xyz, normalTS ) );
if ( normalized )
{
vec = normalize( vec );
}
return vec;
}
float2 PreviewFragmentSphericalUV( in float2 uv )
{
float3 vertexPos = PreviewFragmentPositionOS( uv );
return float2( atan2( vertexPos.x, -vertexPos.z ) / UNITY_PI + 0.5, uv.y );
}
#endif // PREVIEW_INCLUDED