|
|
|
|
|
|
|
|
|
|
RWTexture2D<float4> uavOutput; |
|
|
|
|
|
|
|
// Calculate the offset in global light index light for current light category |
|
|
|
int GetTileOffset2(PositionInputs posInput, uint lightCategory) |
|
|
|
{ |
|
|
|
uint2 tileIndex = posInput.unPositionSS / TILE_SIZE; |
|
|
|
return (tileIndex.y + lightCategory * _NumTileY) * _NumTileX + tileIndex.x; |
|
|
|
} |
|
|
|
|
|
|
|
void GetCountAndStartTile2(PositionInputs posInput, uint lightCategory, out uint start, out uint lightCount) |
|
|
|
{ |
|
|
|
const int tileOffset = GetTileOffset(posInput, lightCategory); |
|
|
|
|
|
|
|
// The first entry inside a tile is the number of light for lightCategory (thus the +0) |
|
|
|
lightCount = g_vLightListGlobal[DWORD_PER_TILE * tileOffset + 0] & 0xffff; |
|
|
|
start = tileOffset; |
|
|
|
} |
|
|
|
|
|
|
|
void GetCountAndStart2(PositionInputs posInput, uint lightCategory, out uint start, out uint lightCount) |
|
|
|
{ |
|
|
|
GetCountAndStartTile2(posInput, lightCategory, start, lightCount); |
|
|
|
} |
|
|
|
|
|
|
|
// input.positionCS is SV_Position |
|
|
|
uint2 pixelCoord = dispatchThreadId; |
|
|
|
PositionInputs posInput = GetPositionInput(pixelCoord.xy, _ScreenSize.zw); |
|
|
|
float depth = LOAD_TEXTURE2D(_CameraDepthTexture, posInput.unPositionSS).x; |
|
|
|
UpdatePositionInput(depth, _InvViewProjMatrix, _ViewProjMatrix, posInput); |
|
|
|
float3 V = GetWorldSpaceNormalizeViewDir(posInput.positionWS); |
|
|
|
// input.positionCS is SV_Position |
|
|
|
uint2 pixelCoord = dispatchThreadId; |
|
|
|
PositionInputs posInput = GetPositionInput(pixelCoord.xy, _ScreenSize.zw); |
|
|
|
float depth = LOAD_TEXTURE2D(_CameraDepthTexture, posInput.unPositionSS).x; |
|
|
|
UpdatePositionInput(depth, _InvViewProjMatrix, _ViewProjMatrix, posInput); |
|
|
|
float3 V = GetWorldSpaceNormalizeViewDir(posInput.positionWS); |
|
|
|
FETCH_GBUFFER(gbuffer, _GBufferTexture, posInput.unPositionSS); |
|
|
|
BSDFData bsdfData; |
|
|
|
float3 bakeDiffuseLighting; |
|
|
|
DECODE_FROM_GBUFFER(gbuffer, bsdfData, bakeDiffuseLighting); |
|
|
|
FETCH_GBUFFER(gbuffer, _GBufferTexture, posInput.unPositionSS); |
|
|
|
BSDFData bsdfData; |
|
|
|
float3 bakeDiffuseLighting; |
|
|
|
DECODE_FROM_GBUFFER(gbuffer, bsdfData, bakeDiffuseLighting); |
|
|
|
PreLightData preLightData = GetPreLightData(V, posInput, bsdfData); |
|
|
|
PreLightData preLightData = GetPreLightData(V, posInput, bsdfData); |
|
|
|
float3 diffuseLighting; |
|
|
|
float3 specularLighting; |
|
|
|
LightLoop(V, posInput, preLightData, bsdfData, bakeDiffuseLighting, diffuseLighting, specularLighting); |
|
|
|
float3 diffuseLighting; |
|
|
|
float3 specularLighting; |
|
|
|
LightLoop(V, posInput, preLightData, bsdfData, bakeDiffuseLighting, diffuseLighting, specularLighting); |
|
|
|
uavOutput[pixelCoord] = float4(diffuseLighting + specularLighting, 1.0); |
|
|
|
uavOutput[pixelCoord] = float4(diffuseLighting + specularLighting, 1.0); |
|
|
|
} |
|
|
|
|