Files
UnrealEngineUWP/Engine/Shaders/Private/SceneData.ush
T

205 lines
11 KiB
Plaintext
Raw Normal View History

// Copyright Epic Games, Inc. All Rights Reserved.
/**
* SceneData.ush
*/
// Whether to fetch primitive values (eg LocalToWorld) by dynamically indexing a scene-wide buffer, or to reference a single Primitive uniform buffer
#define VF_USE_PRIMITIVE_SCENE_DATA ((FEATURE_LEVEL >= FEATURE_LEVEL_SM5 || FEATURE_LEVEL == FEATURE_LEVEL_ES3_1) && VF_SUPPORTS_PRIMITIVE_SCENE_DATA)
#if VF_USE_PRIMITIVE_SCENE_DATA
2019-05-22 18:03:07 -04:00
#define NUM_CUSTOM_PRIMITIVE_DATA 8 // Num float4s used for custom data. Must match FCustomPrimitiveData::NumCustomPrimitiveDataFloat4s in SceneTypes.h
// Must match FPrimitiveUniformShaderParameters in C++
struct FPrimitiveSceneData
{
float4x4 LocalToWorld;
float4 InvNonUniformScaleAndDeterminantSign;
float4 ObjectWorldPositionAndRadius;
float4x4 WorldToLocal;
float4x4 PreviousLocalToWorld;
float4x4 PreviousWorldToLocal;
float3 ActorWorldPosition;
float UseSingleSampleShadowFromStationaryLights;
float3 ObjectBounds;
float LpvBiasMultiplier;
float DecalReceiverMask;
float PerObjectGBufferData;
float UseVolumetricLightmapShadowFromStationaryLights;
float DrawsVelocity;
float4 ObjectOrientation;
float4 NonUniformScale;
float3 LocalObjectBoundsMin;
uint LightingChannelMask;
float3 LocalObjectBoundsMax;
uint LightmapDataIndex;
float3 PreSkinnedLocalBoundsMin;
int SingleCaptureIndex;
float3 PreSkinnedLocalBoundsMax;
uint OutputVelocity;
float4 CustomPrimitiveData[NUM_CUSTOM_PRIMITIVE_DATA];
};
// Stride of a single primitive's data in float4's, must match C++
2019-05-22 18:03:07 -04:00
#define PRIMITIVE_SCENE_DATA_STRIDE 35
// Fetch from scene primitive buffer
FPrimitiveSceneData GetPrimitiveData_Buffer(uint PrimitiveId)
{
// Note: layout must match FPrimitiveSceneShaderData in C++
// Relying on optimizer to remove unused loads
FPrimitiveSceneData PrimitiveData;
uint PrimitiveBaseOffset = PrimitiveId * PRIMITIVE_SCENE_DATA_STRIDE;
PrimitiveData.LocalToWorld[0] = View.PrimitiveSceneData[PrimitiveBaseOffset + 0];
PrimitiveData.LocalToWorld[1] = View.PrimitiveSceneData[PrimitiveBaseOffset + 1];
PrimitiveData.LocalToWorld[2] = View.PrimitiveSceneData[PrimitiveBaseOffset + 2];
PrimitiveData.LocalToWorld[3] = View.PrimitiveSceneData[PrimitiveBaseOffset + 3];
PrimitiveData.InvNonUniformScaleAndDeterminantSign = View.PrimitiveSceneData[PrimitiveBaseOffset + 4];
PrimitiveData.ObjectWorldPositionAndRadius = View.PrimitiveSceneData[PrimitiveBaseOffset + 5];
PrimitiveData.WorldToLocal[0] = View.PrimitiveSceneData[PrimitiveBaseOffset + 6];
PrimitiveData.WorldToLocal[1] = View.PrimitiveSceneData[PrimitiveBaseOffset + 7];
PrimitiveData.WorldToLocal[2] = View.PrimitiveSceneData[PrimitiveBaseOffset + 8];
PrimitiveData.WorldToLocal[3] = View.PrimitiveSceneData[PrimitiveBaseOffset + 9];
PrimitiveData.PreviousLocalToWorld[0] = View.PrimitiveSceneData[PrimitiveBaseOffset + 10];
PrimitiveData.PreviousLocalToWorld[1] = View.PrimitiveSceneData[PrimitiveBaseOffset + 11];
PrimitiveData.PreviousLocalToWorld[2] = View.PrimitiveSceneData[PrimitiveBaseOffset + 12];
PrimitiveData.PreviousLocalToWorld[3] = View.PrimitiveSceneData[PrimitiveBaseOffset + 13];
PrimitiveData.PreviousWorldToLocal[0] = View.PrimitiveSceneData[PrimitiveBaseOffset + 14];
PrimitiveData.PreviousWorldToLocal[1] = View.PrimitiveSceneData[PrimitiveBaseOffset + 15];
PrimitiveData.PreviousWorldToLocal[2] = View.PrimitiveSceneData[PrimitiveBaseOffset + 16];
PrimitiveData.PreviousWorldToLocal[3] = View.PrimitiveSceneData[PrimitiveBaseOffset + 17];
PrimitiveData.ActorWorldPosition = View.PrimitiveSceneData[PrimitiveBaseOffset + 18].xyz;
PrimitiveData.UseSingleSampleShadowFromStationaryLights = View.PrimitiveSceneData[PrimitiveBaseOffset + 18].w;
PrimitiveData.ObjectBounds = View.PrimitiveSceneData[PrimitiveBaseOffset + 19].xyz;
PrimitiveData.LpvBiasMultiplier = View.PrimitiveSceneData[PrimitiveBaseOffset + 19].w;
PrimitiveData.DecalReceiverMask = View.PrimitiveSceneData[PrimitiveBaseOffset + 20].x;
PrimitiveData.PerObjectGBufferData = View.PrimitiveSceneData[PrimitiveBaseOffset + 20].y;
PrimitiveData.UseVolumetricLightmapShadowFromStationaryLights = View.PrimitiveSceneData[PrimitiveBaseOffset + 20].z;
PrimitiveData.DrawsVelocity = View.PrimitiveSceneData[PrimitiveBaseOffset + 20].w;
PrimitiveData.ObjectOrientation = View.PrimitiveSceneData[PrimitiveBaseOffset + 21];
PrimitiveData.NonUniformScale = View.PrimitiveSceneData[PrimitiveBaseOffset + 22];
PrimitiveData.LocalObjectBoundsMin = View.PrimitiveSceneData[PrimitiveBaseOffset + 23].xyz;
PrimitiveData.LightingChannelMask = asuint(View.PrimitiveSceneData[PrimitiveBaseOffset + 23].w);
PrimitiveData.LocalObjectBoundsMax = View.PrimitiveSceneData[PrimitiveBaseOffset + 24].xyz;
PrimitiveData.LightmapDataIndex = asuint(View.PrimitiveSceneData[PrimitiveBaseOffset + 24].w);
PrimitiveData.PreSkinnedLocalBoundsMin = View.PrimitiveSceneData[PrimitiveBaseOffset + 25].xyz;
PrimitiveData.SingleCaptureIndex = asuint(View.PrimitiveSceneData[PrimitiveBaseOffset + 25].w);
PrimitiveData.PreSkinnedLocalBoundsMax = View.PrimitiveSceneData[PrimitiveBaseOffset + 26].xyz;
PrimitiveData.OutputVelocity = asuint(View.PrimitiveSceneData[PrimitiveBaseOffset + 26].w);
UNROLL
for (int i = 0; i < NUM_CUSTOM_PRIMITIVE_DATA; i++)
{
PrimitiveData.CustomPrimitiveData[i] = View.PrimitiveSceneData[PrimitiveBaseOffset + 27 + i];
}
return PrimitiveData;
}
// Fetch from scene primitive texture2D
FPrimitiveSceneData GetPrimitiveData_Texture2D(uint PrimitiveId)
{
// Note: layout must match FPrimitiveSceneShaderData in C++
// Relying on optimizer to remove unused loads
FPrimitiveSceneData PrimitiveData;
uint LinePrimitive = (PrimitiveId & 0xFFFF0000) >> 16;
uint OffsetPrimitive = PrimitiveId & 0xFFFF;
OffsetPrimitive = OffsetPrimitive * PRIMITIVE_SCENE_DATA_STRIDE;
PrimitiveData.LocalToWorld[0] = View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 0, LinePrimitive, 0));
PrimitiveData.LocalToWorld[1] = View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 1, LinePrimitive, 0));
PrimitiveData.LocalToWorld[2] = View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 2, LinePrimitive, 0));
PrimitiveData.LocalToWorld[3] = View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 3, LinePrimitive, 0));
PrimitiveData.InvNonUniformScaleAndDeterminantSign = View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 4, LinePrimitive, 0));
PrimitiveData.ObjectWorldPositionAndRadius = View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 5, LinePrimitive, 0));
PrimitiveData.WorldToLocal[0] = View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 6, LinePrimitive, 0));
PrimitiveData.WorldToLocal[1] = View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 7, LinePrimitive, 0));
PrimitiveData.WorldToLocal[2] = View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 8, LinePrimitive, 0));
PrimitiveData.WorldToLocal[3] = View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 9, LinePrimitive, 0));
PrimitiveData.PreviousLocalToWorld[0] = View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 10, LinePrimitive, 0));
PrimitiveData.PreviousLocalToWorld[1] = View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 11, LinePrimitive, 0));
PrimitiveData.PreviousLocalToWorld[2] = View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 12, LinePrimitive, 0));
PrimitiveData.PreviousLocalToWorld[3] = View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 13, LinePrimitive, 0));
PrimitiveData.PreviousWorldToLocal[0] = View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 14, LinePrimitive, 0));
PrimitiveData.PreviousWorldToLocal[1] = View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 15, LinePrimitive, 0));
PrimitiveData.PreviousWorldToLocal[2] = View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 16, LinePrimitive, 0));
PrimitiveData.PreviousWorldToLocal[3] = View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 17, LinePrimitive, 0));
PrimitiveData.ActorWorldPosition = View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 18, LinePrimitive, 0)).xyz;
PrimitiveData.UseSingleSampleShadowFromStationaryLights = View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 18, LinePrimitive, 0)).w;
PrimitiveData.ObjectBounds = View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 19, LinePrimitive, 0)).xyz;
PrimitiveData.LpvBiasMultiplier = View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 19, LinePrimitive, 0)).w;
PrimitiveData.DecalReceiverMask = View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 20, LinePrimitive, 0)).x;
PrimitiveData.PerObjectGBufferData = View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 20, LinePrimitive, 0)).y;
PrimitiveData.UseVolumetricLightmapShadowFromStationaryLights = View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 20, LinePrimitive, 0)).z;
PrimitiveData.DrawsVelocity = View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 20, LinePrimitive, 0)).w;
PrimitiveData.ObjectOrientation = View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 21, LinePrimitive, 0));
PrimitiveData.NonUniformScale = View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 22, LinePrimitive, 0));
PrimitiveData.LocalObjectBoundsMin = View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 23, LinePrimitive, 0)).xyz;
PrimitiveData.LightingChannelMask = asuint(View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 23, LinePrimitive, 0)).w);
PrimitiveData.LocalObjectBoundsMax = View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 24, LinePrimitive, 0)).xyz;
PrimitiveData.LightmapDataIndex = asuint(View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 24, LinePrimitive, 0)).w);
PrimitiveData.PreSkinnedLocalBoundsMin = View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 25, LinePrimitive, 0)).xyz;
PrimitiveData.SingleCaptureIndex = asuint(View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 25, LinePrimitive, 0)).w);
PrimitiveData.PreSkinnedLocalBoundsMax = View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 26, LinePrimitive, 0)).xyz;
PrimitiveData.OutputVelocity = asuint(View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 26, LinePrimitive, 0)).w);
UNROLL
for (int i = 0; i < NUM_CUSTOM_PRIMITIVE_DATA; i++)
{
PrimitiveData.CustomPrimitiveData[i] = View.PrimitiveSceneDataTexture.Load(float3(OffsetPrimitive + 27 + i, LinePrimitive, 0));
}
return PrimitiveData;
}
FPrimitiveSceneData GetPrimitiveData(uint PrimitiveId)
{
// Note: layout must match FPrimitiveSceneShaderData in C++
// Relying on optimizer to remove unused loads
#if VF_GPU_SCENE_TEXTURE
return GetPrimitiveData_Texture2D(PrimitiveId);
#else
return GetPrimitiveData_Buffer(PrimitiveId);
#endif
}
#else
// Route to Primitive uniform buffer
#define GetPrimitiveData(x) Primitive
#endif