您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
37 行
1.4 KiB
37 行
1.4 KiB
#pragma kernel BuildDispatchIndirect
|
|
|
|
#include "CoreRP/ShaderLibrary/Common.hlsl"
|
|
#include "LightLoop.cs.hlsl"
|
|
|
|
#include "../../ShaderVariables.hlsl"
|
|
#define UNITY_MATERIAL_LIT // Need to be define before including Material.hlsl
|
|
#include "../../Material/Material.hlsl" // This includes Material.hlsl
|
|
|
|
RWBuffer<uint> g_DispatchIndirectBuffer : register( u0 ); // Indirect arguments have to be in a _buffer_, not a structured buffer
|
|
RWStructuredBuffer<uint> g_TileList;
|
|
StructuredBuffer<uint> g_TileFeatureFlags;
|
|
|
|
uniform uint g_NumTiles;
|
|
uniform uint g_NumTilesX;
|
|
|
|
[numthreads(64, 1, 1)]
|
|
void BuildDispatchIndirect(uint dispatchThreadId : SV_DispatchThreadID)
|
|
{
|
|
if (dispatchThreadId >= g_NumTiles)
|
|
return;
|
|
|
|
uint featureFlags = g_TileFeatureFlags[dispatchThreadId];
|
|
|
|
uint tileY = (dispatchThreadId + 0.5f) / (float)g_NumTilesX; // Integer division is extremely expensive, so we better avoid it
|
|
uint tileX = dispatchThreadId - tileY * g_NumTilesX;
|
|
|
|
// Check if there is no material (means it is a sky/background pixel).
|
|
// Note that we can have no lights, yet we still need to render geometry with precomputed illumination.
|
|
if ((featureFlags & MATERIAL_FEATURE_MASK_FLAGS) != 0)
|
|
{
|
|
uint variant = FeatureFlagsToTileVariant(featureFlags);
|
|
uint offset;
|
|
InterlockedAdd(g_DispatchIndirectBuffer[variant * 3 + 0], 1, offset);
|
|
g_TileList[variant * g_NumTiles + offset] = (tileY << 16) | tileX;
|
|
}
|
|
}
|