浏览代码

Lightlistbuild optimizations

Calculate linear depths as part of depth min/max calculation to avoid
fetching depth twice.
Store camera dimensions in uniforms instead of using GetDimensions
/main
runestubbe 8 年前
当前提交
dea646ba
共有 2 个文件被更改,包括 22 次插入22 次删除
  1. 1
      Assets/ScriptableRenderLoop/fptl/FptlLighting.cs
  2. 43
      Assets/ScriptableRenderLoop/fptl/lightlistbuild.compute

1
Assets/ScriptableRenderLoop/fptl/FptlLighting.cs


cmd.SetComputeBufferParam(m_BuildScreenAABBShader, kGenAABBKernel, "g_vBoundsBuffer", m_aabbBoundsBuffer);
cmd.ComputeDispatch(m_BuildScreenAABBShader, kGenAABBKernel, (numLights + 7) / 8, 1, 1);
cmd.SetComputeIntParams(m_BuildPerTileLightListShader, "g_viDimensions", new int[2] { iW, iH });
cmd.SetComputeIntParam(m_BuildPerTileLightListShader, "g_iNrVisibLights", numLights);
SetMatrixCS(cmd, m_BuildPerTileLightListShader, "g_mScrProjection", projscr);
SetMatrixCS(cmd, m_BuildPerTileLightListShader, "g_mInvScrProjection", invProjscr);

43
Assets/ScriptableRenderLoop/fptl/lightlistbuild.compute


uniform int g_iNrVisibLights;
uniform uint2 g_viDimensions;
uniform float4x4 g_mInvScrProjection;
uniform float4x4 g_mScrProjection;

if(t<MAX_NR_COARSE_ENTRIES)
prunedList[t]=0;
uint iWidth;
uint iHeight;
g_depth_tex.GetDimensions(iWidth, iHeight);
uint iWidth = g_viDimensions.x;
uint iHeight = g_viDimensions.y;
uint nrTilesX = (iWidth+15)/16;
uint nrTilesY = (iHeight+15)/16;

// establish min and max depth first
float dpt_mi=asfloat(uFltMax), dpt_ma=0.0;
for(int idx=t; idx<256; idx+=NR_THREADS)
float4 vLinDepths;
uint2 uCrd = min( uint2(viTilLL.x+(idx&0xf), viTilLL.y+(idx>>4)), uint2(iWidth-1, iHeight-1) );
const float fDpth = FetchDepth(g_depth_tex, uCrd);
if(fDpth<VIEWPORT_SCALE_Z) // if not skydome
// Fetch depths and calculate min/max
[unroll]
for(int i = 0; i < 4; i++)
dpt_mi = min(fDpth, dpt_mi);
dpt_ma = max(fDpth, dpt_ma);
int idx = i * NR_THREADS + t;
uint2 uCrd = min( uint2(viTilLL.x+(idx&0xf), viTilLL.y+(idx>>4)), uint2(iWidth-1, iHeight-1) );
const float fDepth = FetchDepth(g_depth_tex, uCrd);
vLinDepths[i] = GetLinearDepth(fDepth);
if(fDepth<VIEWPORT_SCALE_Z) // if not skydome
{
dpt_mi = min(fDepth, dpt_mi);
dpt_ma = max(fDepth, dpt_ma);
}
}
InterlockedMax(ldsZMax, asuint(dpt_ma) );
InterlockedMin(ldsZMin, asuint(dpt_mi) );
InterlockedMax(ldsZMax, asuint(dpt_ma));
InterlockedMin(ldsZMin, asuint(dpt_mi));
GroupMemoryBarrierWithGroupSync();
GroupMemoryBarrierWithGroupSync();
}
float3 vTileLL = float3(viTilLL.x/(float) iWidth, viTilLL.y/(float) iHeight, asfloat(ldsZMin));

}
#else
{
float4 vLinDepths;
[unroll]for(int i=0; i<4; i++)
{
int idx = t + i*NR_THREADS;
uint2 uCrd = min( uint2(viTilLL.x+(idx&0xf), viTilLL.y+(idx>>4)), uint2(iWidth-1, iHeight-1) );
float3 v3ScrPos = float3(uCrd.x+0.5, uCrd.y+0.5, FetchDepth(g_depth_tex, uCrd));
vLinDepths[i] = GetLinearDepth(v3ScrPos.z);
}
uint uLightsFlags[2] = {0,0};
int l=0;
// need this outer loop even on xb1 and ps4 since direct lights and

正在加载...
取消
保存