143 lines
3.9 KiB
HLSL
143 lines
3.9 KiB
HLSL
//Grass Batches
|
|
#define GRASS_BATCH_NUM_CONSTS_PER_INSTANCE (3)
|
|
#define GRASS_BATCH_SHARED_DATA_COUNT (8)
|
|
#define GRASS_BATCH_CS_CULLING ((1 && (__D3D11 && RSG_PC)) || (1 && RSG_DURANGO) || (1 && RSG_ORBIS)) //(1 && (__SHADERMODEL >= 40))
|
|
|
|
#define GRASS_BATCH_CS_THREADS_PER_WAVEFRONT 64
|
|
|
|
#if GRASS_BATCH_CS_CULLING
|
|
# define GRASS_BATCH_CS_CULLING_SWITCH(_if_CS_,_else_) _if_CS_
|
|
#else
|
|
# define GRASS_BATCH_CS_CULLING_SWITCH(_if_CS_,_else_) _else_
|
|
#endif
|
|
|
|
#if defined(__SHADERMODEL)
|
|
# define CASCADE_SHADOWS_SCAN_NUM_PLANES 16 //See ScanCascadeShadows.h (Only define for shaders.)
|
|
|
|
//Grass batch instanced vert stream is interpreted by the input assembler/fetch shader. I don't think that'll work for the CS.
|
|
struct BatchRawInstanceData //grassBatchRawInstanceData
|
|
{
|
|
uint PosXY_u16;
|
|
uint PosZ_u16_NormXY_u8;
|
|
uint ColorRGB_Scale_u8;
|
|
uint Ao_Pad3_u8;
|
|
};
|
|
|
|
struct BatchCSInstanceData
|
|
{
|
|
//BatchRawInstanceData raw;
|
|
uint InstId_u16_CrossFade_Scale_u8;
|
|
};
|
|
|
|
//This is now in the raw structured buffer!
|
|
struct BatchInstanceData
|
|
{
|
|
float2 pos : BLENDWEIGHT;
|
|
float posZ : TEXCOORD1;
|
|
float2 normal : TEXCOORD2;
|
|
float4 color_scale : TEXCOORD3;
|
|
float4 ao_pad3 : TEXCOORD7;
|
|
};
|
|
|
|
struct BatchGlobalData
|
|
{
|
|
float4 worldMatA : TEXCOORD4;
|
|
float4 worldMatB : TEXCOORD5;
|
|
float4 worldMatC : TEXCOORD6;
|
|
};
|
|
|
|
struct BatchComputeData
|
|
{
|
|
uint InstId;
|
|
float CrossFade;
|
|
float Scale;
|
|
};
|
|
|
|
BatchInstanceData ExpandRawInstanceDataBigEndian(BatchRawInstanceData raw)
|
|
{
|
|
BatchInstanceData OUT;
|
|
uint3 pos;
|
|
pos.x = (raw.PosXY_u16 >> 16) & 0xFFFF;
|
|
pos.y = (raw.PosXY_u16) & 0xFFFF;
|
|
pos.z = (raw.PosZ_u16_NormXY_u8 >> 16) & 0xFFFF;
|
|
|
|
uint2 normal;
|
|
normal.x = (raw.PosZ_u16_NormXY_u8 >> 8) & 0xFF;
|
|
normal.y = (raw.PosZ_u16_NormXY_u8) & 0xFF;
|
|
|
|
uint3 color;
|
|
color.r = (raw.ColorRGB_Scale_u8 >> 24) & 0xFF;
|
|
color.g = (raw.ColorRGB_Scale_u8 >> 16) & 0xFF;
|
|
color.b = (raw.ColorRGB_Scale_u8 >> 8) & 0xFF;
|
|
|
|
uint scale = (raw.ColorRGB_Scale_u8) & 0xFF;
|
|
|
|
uint aoScale = (raw.Ao_Pad3_u8 >> 24) & 0xFF;
|
|
|
|
OUT.pos = ((float2)pos.xy) / 65535.0f;
|
|
OUT.posZ = ((float)pos.z) / 65535.0f;
|
|
OUT.normal = ((float2)normal) / 255.0f;
|
|
OUT.color_scale.rgb = ((float3)color) / 255.0f;
|
|
OUT.color_scale.w = ((float)scale) / 255.0f;
|
|
OUT.ao_pad3 = ((float)aoScale) / 255.0f;
|
|
|
|
return OUT;
|
|
}
|
|
|
|
BatchInstanceData ExpandRawInstanceData(BatchRawInstanceData raw)
|
|
{
|
|
//Since we are bit-shifting binary data, need to remember endian order...
|
|
BatchInstanceData OUT;
|
|
uint3 pos;
|
|
pos.x = (raw.PosXY_u16) & 0xFFFF;
|
|
pos.y = (raw.PosXY_u16 >> 16) & 0xFFFF;
|
|
pos.z = (raw.PosZ_u16_NormXY_u8) & 0xFFFF;
|
|
|
|
uint2 normal;
|
|
normal.x = (raw.PosZ_u16_NormXY_u8 >> 16) & 0xFF;
|
|
normal.y = (raw.PosZ_u16_NormXY_u8 >> 24) & 0xFF;
|
|
|
|
uint3 color;
|
|
color.r = (raw.ColorRGB_Scale_u8) & 0xFF;
|
|
color.g = (raw.ColorRGB_Scale_u8 >> 8) & 0xFF;
|
|
color.b = (raw.ColorRGB_Scale_u8 >> 16) & 0xFF;
|
|
|
|
uint scale = (raw.ColorRGB_Scale_u8 >> 24) & 0xFF;
|
|
|
|
uint aoScale = (raw.Ao_Pad3_u8) & 0xFF;
|
|
|
|
OUT.pos = ((float2)pos.xy) / 65535.0f;
|
|
OUT.posZ = ((float)pos.z) / 65535.0f;
|
|
OUT.normal = ((float2)normal) / 255.0f;
|
|
OUT.color_scale.rgb = ((float3)color) / 255.0f;
|
|
OUT.color_scale.w = ((float)scale) / 255.0f;
|
|
OUT.ao_pad3 = ((float)aoScale) / 255.0f;
|
|
|
|
return OUT;
|
|
}
|
|
|
|
BatchComputeData ExpandComputeData(BatchCSInstanceData csData)
|
|
{
|
|
BatchComputeData OUT;
|
|
OUT.InstId = csData.InstId_u16_CrossFade_Scale_u8 & 0xFFFF;
|
|
|
|
uint crossFade = (csData.InstId_u16_CrossFade_Scale_u8 >> 16) & 0xFF;
|
|
uint scale = (csData.InstId_u16_CrossFade_Scale_u8 >> 24) & 0xFF;
|
|
|
|
OUT.CrossFade = ((float) crossFade) / 255.0f;
|
|
OUT.Scale = ((float) scale) / 255.0f;
|
|
|
|
return OUT;
|
|
}
|
|
|
|
#else
|
|
# define GrassBatchCSInstanceData_Size (sizeof(u32) * 1)
|
|
# define GrassBatchCSInstanceData_Align (4) //4 is min size for PS4?
|
|
|
|
# if GRASS_BATCH_CS_CULLING
|
|
# define GRASS_BATCH_CS_CULLING_ONLY(...) __VA_ARGS__
|
|
# else
|
|
# define GRASS_BATCH_CS_CULLING_ONLY(...)
|
|
# endif
|
|
#endif
|