310 lines
11 KiB
HLSL
310 lines
11 KiB
HLSL
// UNITY_SHADER_NO_UPGRADE
|
|
|
|
#ifndef UNIVERSAL_SHADER_VARIABLES_INCLUDED
|
|
#define UNIVERSAL_SHADER_VARIABLES_INCLUDED
|
|
// Unity Engine built-in shader input variables.
|
|
// URP package specific shader input variables are defined in .universal/ShaderLibrary/Input.hlsl
|
|
|
|
#if defined(STEREO_INSTANCING_ON) && (defined(SHADER_API_D3D11) || defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE) || defined(SHADER_API_PSSL) || defined(SHADER_API_VULKAN) || (defined(SHADER_API_METAL) && !defined(UNITY_COMPILER_DXC)))
|
|
#define UNITY_STEREO_INSTANCING_ENABLED
|
|
#endif
|
|
|
|
#if defined(STEREO_MULTIVIEW_ON) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE) || defined(SHADER_API_VULKAN)) && !(defined(SHADER_API_SWITCH))
|
|
#define UNITY_STEREO_MULTIVIEW_ENABLED
|
|
#endif
|
|
|
|
#if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED)
|
|
#define USING_STEREO_MATRICES
|
|
#endif
|
|
|
|
#if defined(USING_STEREO_MATRICES)
|
|
// Current pass transforms.
|
|
#define glstate_matrix_projection unity_StereoMatrixP[unity_StereoEyeIndex] // goes through GL.GetGPUProjectionMatrix()
|
|
#define unity_MatrixV unity_StereoMatrixV[unity_StereoEyeIndex]
|
|
#define unity_MatrixInvV unity_StereoMatrixInvV[unity_StereoEyeIndex]
|
|
#define unity_MatrixInvP unity_StereoMatrixInvP[unity_StereoEyeIndex]
|
|
#define unity_MatrixVP unity_StereoMatrixVP[unity_StereoEyeIndex]
|
|
#define unity_MatrixInvVP unity_StereoMatrixInvVP[unity_StereoEyeIndex]
|
|
|
|
// Camera transform (but the same as pass transform for XR).
|
|
#define unity_CameraProjection unity_StereoCameraProjection[unity_StereoEyeIndex] // Does not go through GL.GetGPUProjectionMatrix()
|
|
#define unity_CameraInvProjection unity_StereoCameraInvProjection[unity_StereoEyeIndex]
|
|
#define unity_WorldToCamera unity_StereoMatrixV[unity_StereoEyeIndex] // Should be unity_StereoWorldToCamera but no use-case in XR pass
|
|
#define unity_CameraToWorld unity_StereoMatrixInvV[unity_StereoEyeIndex] // Should be unity_StereoCameraToWorld but no use-case in XR pass
|
|
#define _WorldSpaceCameraPos unity_StereoWorldSpaceCameraPos[unity_StereoEyeIndex]
|
|
#endif
|
|
|
|
#define UNITY_LIGHTMODEL_AMBIENT (glstate_lightmodel_ambient * 2)
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// Time (t = time since current level load) values from Unity
|
|
float4 _Time; // (t/20, t, t*2, t*3)
|
|
float4 _SinTime; // sin(t/8), sin(t/4), sin(t/2), sin(t)
|
|
float4 _CosTime; // cos(t/8), cos(t/4), cos(t/2), cos(t)
|
|
float4 unity_DeltaTime; // dt, 1/dt, smoothdt, 1/smoothdt
|
|
float4 _TimeParameters; // t, sin(t), cos(t)
|
|
float4 _LastTimeParameters; // t, sin(t), cos(t)
|
|
|
|
#if !defined(USING_STEREO_MATRICES)
|
|
float3 _WorldSpaceCameraPos;
|
|
#endif
|
|
|
|
// x = 1 or -1 (-1 if projection is flipped)
|
|
// y = near plane
|
|
// z = far plane
|
|
// w = 1/far plane
|
|
float4 _ProjectionParams;
|
|
|
|
// x = width
|
|
// y = height
|
|
// z = 1 + 1.0/width
|
|
// w = 1 + 1.0/height
|
|
float4 _ScreenParams;
|
|
|
|
// Values used to linearize the Z buffer (http://www.humus.name/temp/Linearize%20depth.txt)
|
|
// x = 1-far/near
|
|
// y = far/near
|
|
// z = x/far
|
|
// w = y/far
|
|
// or in case of a reversed depth buffer (UNITY_REVERSED_Z is 1)
|
|
// x = -1+far/near
|
|
// y = 1
|
|
// z = x/far
|
|
// w = 1/far
|
|
float4 _ZBufferParams;
|
|
|
|
// x = orthographic camera's width
|
|
// y = orthographic camera's height
|
|
// z = unused
|
|
// w = 1.0 if camera is ortho, 0.0 if perspective
|
|
float4 unity_OrthoParams;
|
|
|
|
// scaleBias.x = flipSign
|
|
// scaleBias.y = scale
|
|
// scaleBias.z = bias
|
|
// scaleBias.w = unused
|
|
uniform float4 _ScaleBias;
|
|
uniform float4 _ScaleBiasRt;
|
|
|
|
// { w / RTHandle.maxWidth, h / RTHandle.maxHeight } : xy = currFrame, zw = prevFrame
|
|
uniform float4 _RTHandleScale;
|
|
|
|
float4 unity_CameraWorldClipPlanes[6];
|
|
|
|
#if !defined(USING_STEREO_MATRICES)
|
|
// Projection matrices of the camera. Note that this might be different from projection matrix
|
|
// that is set right now, e.g. while rendering shadows the matrices below are still the projection
|
|
// of original camera.
|
|
float4x4 unity_CameraProjection;
|
|
float4x4 unity_CameraInvProjection;
|
|
float4x4 unity_WorldToCamera;
|
|
float4x4 unity_CameraToWorld;
|
|
#endif
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
#ifndef DOTS_INSTANCING_ON // UnityPerDraw cbuffer doesn't exist with hybrid renderer
|
|
|
|
// Block Layout should be respected due to SRP Batcher
|
|
CBUFFER_START(UnityPerDraw)
|
|
// Space block Feature
|
|
float4x4 unity_ObjectToWorld;
|
|
float4x4 unity_WorldToObject;
|
|
float4 unity_LODFade; // x is the fade value ranging within [0,1]. y is x quantized into 16 levels
|
|
real4 unity_WorldTransformParams; // w is usually 1.0, or -1.0 for odd-negative scale transforms
|
|
|
|
// Render Layer block feature
|
|
// Only the first channel (x) contains valid data and the float must be reinterpreted using asuint() to extract the original 32 bits values.
|
|
float4 unity_RenderingLayer;
|
|
|
|
// Light Indices block feature
|
|
// These are set internally by the engine upon request by RendererConfiguration.
|
|
half4 unity_LightData;
|
|
half4 unity_LightIndices[2];
|
|
|
|
float4 unity_ProbesOcclusion;
|
|
|
|
// Reflection Probe 0 block feature
|
|
// HDR environment map decode instructions
|
|
real4 unity_SpecCube0_HDR;
|
|
real4 unity_SpecCube1_HDR;
|
|
|
|
float4 unity_SpecCube0_BoxMax; // w contains the blend distance
|
|
float4 unity_SpecCube0_BoxMin; // w contains the lerp value
|
|
float4 unity_SpecCube0_ProbePosition; // w is set to 1 for box projection
|
|
float4 unity_SpecCube1_BoxMax; // w contains the blend distance
|
|
float4 unity_SpecCube1_BoxMin; // w contains the sign of (SpecCube0.importance - SpecCube1.importance)
|
|
float4 unity_SpecCube1_ProbePosition; // w is set to 1 for box projection
|
|
|
|
// Lightmap block feature
|
|
float4 unity_LightmapST;
|
|
float4 unity_DynamicLightmapST;
|
|
|
|
// SH block feature
|
|
real4 unity_SHAr;
|
|
real4 unity_SHAg;
|
|
real4 unity_SHAb;
|
|
real4 unity_SHBr;
|
|
real4 unity_SHBg;
|
|
real4 unity_SHBb;
|
|
real4 unity_SHC;
|
|
|
|
// Renderer bounding box.
|
|
float4 unity_RendererBounds_Min;
|
|
float4 unity_RendererBounds_Max;
|
|
|
|
// Velocity
|
|
float4x4 unity_MatrixPreviousM;
|
|
float4x4 unity_MatrixPreviousMI;
|
|
//X : Use last frame positions (right now skinned meshes are the only objects that use this
|
|
//Y : Force No Motion
|
|
//Z : Z bias value
|
|
//W : Camera only
|
|
float4 unity_MotionVectorsParams;
|
|
|
|
// Sprite.
|
|
float4 unity_SpriteColor;
|
|
//X : FlipX
|
|
//Y : FlipY
|
|
//Z : Reserved for future use.
|
|
//W : Reserved for future use.
|
|
float4 unity_SpriteProps;
|
|
CBUFFER_END
|
|
|
|
#endif // UNITY_DOTS_INSTANCING_ENABLED
|
|
|
|
#if defined(USING_STEREO_MATRICES)
|
|
CBUFFER_START(UnityStereoViewBuffer)
|
|
float4x4 unity_StereoMatrixP[2];
|
|
float4x4 unity_StereoMatrixInvP[2];
|
|
float4x4 unity_StereoMatrixV[2];
|
|
float4x4 unity_StereoMatrixInvV[2];
|
|
float4x4 unity_StereoMatrixVP[2];
|
|
float4x4 unity_StereoMatrixInvVP[2];
|
|
|
|
float4x4 unity_StereoCameraProjection[2];
|
|
float4x4 unity_StereoCameraInvProjection[2];
|
|
|
|
float3 unity_StereoWorldSpaceCameraPos[2];
|
|
CBUFFER_END
|
|
#endif
|
|
|
|
#if defined(UNITY_STEREO_MULTIVIEW_ENABLED) && defined(SHADER_STAGE_VERTEX)
|
|
// OVR_multiview
|
|
// In order to convey this info over the DX compiler, we wrap it into a cbuffer.
|
|
#if !defined(UNITY_DECLARE_MULTIVIEW)
|
|
#define UNITY_DECLARE_MULTIVIEW(number_of_views) CBUFFER_START(OVR_multiview) uint gl_ViewID; uint numViews_##number_of_views; CBUFFER_END
|
|
#define UNITY_VIEWID gl_ViewID
|
|
#endif
|
|
#endif
|
|
|
|
#if defined(UNITY_STEREO_MULTIVIEW_ENABLED) && defined(SHADER_STAGE_VERTEX)
|
|
#define unity_StereoEyeIndex UNITY_VIEWID
|
|
UNITY_DECLARE_MULTIVIEW(2);
|
|
#elif defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED)
|
|
static uint unity_StereoEyeIndex;
|
|
#endif
|
|
|
|
float4x4 glstate_matrix_transpose_modelview0;
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
real4 glstate_lightmodel_ambient;
|
|
real4 unity_AmbientSky;
|
|
real4 unity_AmbientEquator;
|
|
real4 unity_AmbientGround;
|
|
real4 unity_IndirectSpecColor;
|
|
float4 unity_FogParams;
|
|
real4 unity_FogColor;
|
|
|
|
#if !defined(USING_STEREO_MATRICES)
|
|
float4x4 glstate_matrix_projection;
|
|
float4x4 unity_MatrixV;
|
|
float4x4 unity_MatrixInvV;
|
|
float4x4 unity_MatrixInvP;
|
|
float4x4 unity_MatrixVP;
|
|
float4x4 unity_MatrixInvVP;
|
|
float4 unity_StereoScaleOffset;
|
|
int unity_StereoEyeIndex;
|
|
#endif
|
|
|
|
real4 unity_ShadowColor;
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// Unity specific
|
|
TEXTURECUBE(unity_SpecCube0);
|
|
SAMPLER(samplerunity_SpecCube0);
|
|
TEXTURECUBE(unity_SpecCube1);
|
|
SAMPLER(samplerunity_SpecCube1);
|
|
|
|
// Main lightmap
|
|
TEXTURE2D(unity_Lightmap);
|
|
SAMPLER(samplerunity_Lightmap);
|
|
TEXTURE2D_ARRAY(unity_Lightmaps);
|
|
SAMPLER(samplerunity_Lightmaps);
|
|
|
|
// Dynamic lightmap
|
|
TEXTURE2D(unity_DynamicLightmap);
|
|
SAMPLER(samplerunity_DynamicLightmap);
|
|
// TODO ENLIGHTEN: Instanced GI
|
|
|
|
// Dual or directional lightmap (always used with unity_Lightmap, so can share sampler)
|
|
TEXTURE2D(unity_LightmapInd);
|
|
TEXTURE2D_ARRAY(unity_LightmapsInd);
|
|
TEXTURE2D(unity_DynamicDirectionality);
|
|
// TODO ENLIGHTEN: Instanced GI
|
|
// TEXTURE2D_ARRAY(unity_DynamicDirectionality);
|
|
|
|
TEXTURE2D(unity_ShadowMask);
|
|
SAMPLER(samplerunity_ShadowMask);
|
|
TEXTURE2D_ARRAY(unity_ShadowMasks);
|
|
SAMPLER(samplerunity_ShadowMasks);
|
|
|
|
// Mipmap Streaming Debug
|
|
TEXTURE2D(unity_MipmapStreaming_DebugTex);
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// TODO: all affine matrices should be 3x4.
|
|
// TODO: sort these vars by the frequency of use (descending), and put commonly used vars together.
|
|
// Note: please use UNITY_MATRIX_X macros instead of referencing matrix variables directly.
|
|
#if defined(USING_STEREO_MATRICES)
|
|
float4x4 _PrevViewProjMatrixStereo[2];
|
|
float4x4 _NonJitteredViewProjMatrixStereo[2];
|
|
float4x4 _ViewProjMatrixStereo[2];
|
|
#define _PrevViewProjMatrix _PrevViewProjMatrixStereo[unity_StereoEyeIndex]
|
|
#define _NonJitteredViewProjMatrix _NonJitteredViewProjMatrixStereo[unity_StereoEyeIndex]
|
|
#define _ViewProjMatrix _ViewProjMatrixStereo[unity_StereoEyeIndex]
|
|
#else
|
|
float4x4 _PrevViewProjMatrix; // non-jittered. Motion vectors.
|
|
float4x4 _NonJitteredViewProjMatrix; // non-jittered.
|
|
float4x4 _ViewProjMatrix; // TODO: URP currently uses unity_MatrixVP, see Input.hlsl
|
|
#endif
|
|
float4x4 _ViewMatrix;
|
|
float4x4 _ProjMatrix;
|
|
float4x4 _InvViewProjMatrix;
|
|
float4x4 _InvViewMatrix;
|
|
float4x4 _InvProjMatrix;
|
|
float4 _InvProjParam;
|
|
float4 _ScreenSize; // {w, h, 1/w, 1/h}
|
|
float4 _FrustumPlanes[6]; // {(a, b, c) = N, d = -dot(N, P)} [L, R, T, B, N, F]
|
|
|
|
float4x4 OptimizeProjectionMatrix(float4x4 M)
|
|
{
|
|
// Matrix format (x = non-constant value).
|
|
// Orthographic Perspective Combined(OR)
|
|
// | x 0 0 x | | x 0 x 0 | | x 0 x x |
|
|
// | 0 x 0 x | | 0 x x 0 | | 0 x x x |
|
|
// | x x x x | | x x x x | | x x x x | <- oblique projection row
|
|
// | 0 0 0 1 | | 0 0 x 0 | | 0 0 x x |
|
|
// Notice that some values are always 0.
|
|
// We can avoid loading and doing math with constants.
|
|
M._21_41 = 0;
|
|
M._12_42 = 0;
|
|
return M;
|
|
}
|
|
|
|
#endif // UNIVERSAL_SHADER_VARIABLES_INCLUDED
|