unityzgy/Packages/com.unity.postprocessing/PostProcessing/Shaders/Builtins/ExposureHistogram.compute
ayuan9957 8cfebcb657 feat: 丘陵地形优化与注册 + 地形材质调整
- 丘陵.unity: 地形材质优化(增大tileSize), 添加枯草2种, 替换树木为杨树+阔叶树, 平滑平坦区域过渡, Splatmap用Perlin噪声平滑混合减少突兀边界, 调整减少黄色层次
- 丘陵注册到程序: AB打包, SAMap.txt, SQLite数据库(替换平原), 本地化XML, 8192x8192地图图片(含绿色起点区域)
- 海岛/沙漠/山地: PermissibleArea MeshRenderer统一禁用, 移除临时砾石道路层
- 山地/海岛/沙漠: 地形材质参数调整
2026-07-29 15:50:34 +08:00

103 lines
3.2 KiB
Plaintext

// Put the following line to 0 or comment it to disable vignette weighting
#define USE_VIGNETTE_WEIGHTING 1
#pragma warning(disable : 3568)
#pragma exclude_renderers gles gles3 d3d11_9x
#include "Packages/com.unity.postprocessing/PostProcessing/Shaders/StdLib.hlsl"
#include "Packages/com.unity.postprocessing/PostProcessing/Shaders/Colors.hlsl"
#include "Packages/com.unity.postprocessing/PostProcessing/Shaders/Builtins/ExposureHistogram.hlsl"
RWStructuredBuffer<uint> _HistogramBuffer;
Texture2D<float4> _Source;
SamplerState sampler_LinearClamp;
CBUFFER_START(Params)
float4 _ScaleOffsetRes; // x: scale, y: offset, z: width, w: height
CBUFFER_END
groupshared uint gs_histogram[HISTOGRAM_BINS];
#pragma kernel KEyeHistogram
#ifdef DISABLE_COMPUTE_SHADERS
TRIVIAL_COMPUTE_KERNEL(KEyeHistogram)
TRIVIAL_COMPUTE_KERNEL(KEyeHistogramClear)
#else
[numthreads(HISTOGRAM_THREAD_X, HISTOGRAM_THREAD_Y, 1)]
void KEyeHistogram(uint2 dispatchThreadId : SV_DispatchThreadID, uint2 groupThreadId : SV_GroupThreadID)
{
const uint localThreadId = groupThreadId.y * HISTOGRAM_THREAD_X + groupThreadId.x;
// Clears the shared memory
#if HISTOGRAM_REDUCTION_ALT_PATH
uint localThreadIdOff = localThreadId << 1u;
if (localThreadIdOff < HISTOGRAM_BINS)
{
gs_histogram[localThreadIdOff ] = 0u;
gs_histogram[localThreadIdOff + 1] = 0u;
}
#else
if (localThreadId < HISTOGRAM_BINS)
{
gs_histogram[localThreadId] = 0u;
}
#endif
float2 ipos = float2(dispatchThreadId) * 2.0;
GroupMemoryBarrierWithGroupSync();
// Gather local group histogram
if (ipos.x < _ScaleOffsetRes.z && ipos.y < _ScaleOffsetRes.w)
{
uint weight = 1u;
float2 sspos = ipos / _ScaleOffsetRes.zw;
// Vignette weighting to put more focus on what's in the center of the screen
#if USE_VIGNETTE_WEIGHTING
{
float2 d = abs(sspos - (0.5).xx);
float vfactor = saturate(1.0 - dot(d, d));
vfactor *= vfactor;
weight = (uint)(64.0 * vfactor);
}
#endif
float3 color = _Source.SampleLevel(sampler_LinearClamp, sspos, 0.0).xyz; // Bilinear downsample 2x
float luminance = Luminance(color);
float logLuminance = GetHistogramBinFromLuminance(luminance, _ScaleOffsetRes.xy);
uint idx = (uint)(logLuminance * (HISTOGRAM_BINS - 1u));
InterlockedAdd(gs_histogram[idx], weight);
}
GroupMemoryBarrierWithGroupSync();
// Merge everything
#if HISTOGRAM_REDUCTION_ALT_PATH
if (localThreadIdOff < HISTOGRAM_BINS)
{
InterlockedAdd(_HistogramBuffer[localThreadIdOff ], gs_histogram[localThreadIdOff ]);
InterlockedAdd(_HistogramBuffer[localThreadIdOff + 1], gs_histogram[localThreadIdOff + 1]);
}
#else
if (localThreadId < HISTOGRAM_BINS)
{
InterlockedAdd(_HistogramBuffer[localThreadId], gs_histogram[localThreadId]);
}
#endif
}
#pragma kernel KEyeHistogramClear
[numthreads(HISTOGRAM_THREAD_X, 1, 1)]
void KEyeHistogramClear(uint dispatchThreadId : SV_DispatchThreadID)
{
if (dispatchThreadId < HISTOGRAM_BINS)
_HistogramBuffer[dispatchThreadId] = 0u;
}
#endif // DISABLE_COMPUTE_SHADERS