切换主武器

This commit is contained in:
SoulliesOfficial
2025-12-23 19:47:06 -05:00
parent eaa688c7a9
commit 2a2aa728d5
275 changed files with 12579 additions and 2770 deletions

View File

@@ -15,6 +15,8 @@ namespace SLSFramework.Rendering.PostProcessing
private string profilerTag;
private List<ProfilingSampler> profilingSamplers;
// 核心:材质缓存池,确保每个 Shader 只对应一个材质实例
private Dictionary<string, Material> m_MaterialCache = new Dictionary<string, Material>();
public ScriptablePostProcessorPass(string profilerTag, List<ScriptablePostProcessorVolume> postProcessors)
{
@@ -26,6 +28,30 @@ namespace SLSFramework.Rendering.PostProcessing
private RenderingData m_RenderingData;
// 清理函数,由 Feature.Dispose 调用
public void Cleanup()
{
foreach (var mat in m_MaterialCache.Values)
{
if (mat != null) CoreUtils.Destroy(mat);
}
m_MaterialCache.Clear();
}
private Material GetOrCreateMaterial(string shaderName)
{
if (string.IsNullOrEmpty(shaderName)) return null;
if (m_MaterialCache.TryGetValue(shaderName, out var mat) && mat != null) return mat;
// 调用你的静态工具类创建材质
var shader = Shader.Find(shaderName);
if (shader == null) return null;
mat = CoreUtils.CreateEngineMaterial(shader);
m_MaterialCache[shaderName] = mat;
return mat;
}
private class PassData
{
public TextureHandle SourceTexture;
@@ -35,20 +61,23 @@ namespace SLSFramework.Rendering.PostProcessing
public List<int> ActiveIndices;
public List<ScriptablePostProcessorVolume> Volumes;
public List<ProfilingSampler> Profilers;
public RenderingData RenderingData; // 数据结构保持不变
public RenderingData RenderingData;
}
// 修改 Setup接收 RenderingData 并保存
// 注意:这里的 Setup 需要在 AddRenderPasses 中调用
public bool Setup(ref RenderingData renderingData)
{
this.m_RenderingData = renderingData; // 捕获数据
this.m_RenderingData = renderingData;
activePostProcessorIndex.Clear();
for (int i = 0; i < postProcessors.Count; i++)
{
postProcessors[i].Setup();
if (postProcessors[i].IsActive())
var volume = postProcessors[i];
// 关键修复:从 Pass 的缓存池获取材质并注入给 Volume
var mat = GetOrCreateMaterial(volume.GetShaderName());
volume.SetMaterial(mat);
volume.Setup();
if (volume.IsActive())
{
activePostProcessorIndex.Add(i);
}
@@ -61,50 +90,37 @@ namespace SLSFramework.Rendering.PostProcessing
var resourceData = frameData.Get<UniversalResourceData>();
var cameraData = frameData.Get<UniversalCameraData>();
// 如果没有激活的后处理,直接跳过
if (activePostProcessorIndex.Count == 0) return;
// 1. 获取相机的基础描述符 (这是旧的 RenderTextureDescriptor)
var cameraDesc = cameraData.cameraTargetDescriptor;
// 2. 【核心修正】创建一个新的 RenderGraph 专用描述符 (TextureDesc)
// 只有 TextureDesc 才能设置 name也不能直接把 cameraDesc 强转过去,必须手动赋值
var rgDesc = new TextureDesc(cameraDesc.width, cameraDesc.height);
rgDesc.colorFormat = cameraDesc.graphicsFormat;
rgDesc.depthBufferBits = DepthBits.None; // 后处理不需要深度
rgDesc.msaaSamples = MSAASamples.None; // 后处理通常不需要 MSAA
rgDesc.depthBufferBits = DepthBits.None;
rgDesc.msaaSamples = MSAASamples.None;
using (var builder = renderGraph.AddUnsafePass<PassData>(profilerTag, out var passData))
{
// 填充数据
passData.SourceTexture = resourceData.activeColorTexture;
passData.TargetTexture = resourceData.activeColorTexture;
passData.ActiveIndices = activePostProcessorIndex;
passData.Volumes = postProcessors;
passData.Profilers = profilingSamplers;
// 使用我们在 Setup 中缓存的旧版数据 (解决 UniversalRenderingData 找不到的问题)
passData.RenderingData = m_RenderingData;
// 3. 【核心修正】设置名字并创建纹理
// 这里使用的是 rgDesc (TextureDesc 类型),它有 name 属性
rgDesc.name = "_TemporaryRenderTextureA";
passData.TempTextureA = renderGraph.CreateTexture(rgDesc);
rgDesc.name = "_TemporaryRenderTextureB";
passData.TempTextureB = renderGraph.CreateTexture(rgDesc);
// 声明依赖关系 (保持不变)
builder.UseTexture(passData.SourceTexture, AccessFlags.Read);
builder.UseTexture(passData.TempTextureA, AccessFlags.ReadWrite);
builder.UseTexture(passData.TempTextureB, AccessFlags.ReadWrite);
builder.UseTexture(passData.TargetTexture, AccessFlags.ReadWrite);
// 设置执行逻辑 (保持不变)
builder.SetRenderFunc((PassData data, UnsafeGraphContext context) =>
{
var cmd = CommandBufferHelpers.GetNativeCommandBuffer(context.cmd);
var source = data.SourceTexture;
var target = data.TargetTexture;
var tempA = data.TempTextureA;
@@ -117,7 +133,6 @@ namespace SLSFramework.Rendering.PostProcessing
{
data.Volumes[index].Render(cmd, ref data.RenderingData, source, tempA);
}
Blitter.BlitCameraTexture(cmd, tempA, target);
}
else
@@ -133,10 +148,8 @@ namespace SLSFramework.Rendering.PostProcessing
{
postProcessor.Render(cmd, ref data.RenderingData, currSource, currDest);
}
CoreUtils.Swap(ref currSource, ref currDest);
}
Blitter.BlitCameraTexture(cmd, currSource, target);
}
});