XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
using Vortice.D3DCompiler;
using Vortice.Direct3D;
using Vortice.Direct3D11;
using Vortice.DXGI;
using Vortice.Mathematics;
using XFEEDToolBox.Core.Rendering;

namespace XFEEDToolBox.Rendering;

internal sealed partial class GalaxyGraphics
{
    private ID3D11VertexShader originalHdrVs=null!;
    private ID3D11PixelShader originalHdrPs=null!;
    private ID3D11Buffer originalHdrConstants=null!;
    private ID3D11SamplerState originalHdrSampler=null!;
    private ID3D11Texture2D? originalHdrTexture;
    private ID3D11RenderTargetView? originalHdrTarget;
    private ID3D11ShaderResourceView? originalHdrView;
    private int originalHdrWidth,originalHdrHeight;
    internal bool OriginalHdrReady=>originalHdrView is not null;
    internal bool OriginalBackgroundHdrDrawn {get;private set;}
    internal bool OriginalSceneHdrDrawn {get;private set;}
    internal bool OriginalHdrFullRestored=>GalaxyOriginalHdr.FullRestored;

    private void InitializeOriginalHdr(string shader)
    {
        originalHdrVs=device.CreateVertexShader(Compiler.CompileFromFile(shader,"VSOriginalHdr","vs_5_0").Span);
        originalHdrPs=device.CreatePixelShader(Compiler.CompileFromFile(shader,"PSOriginalHdr","ps_5_0").Span);
        originalHdrConstants=device.CreateBuffer(11*16,BindFlags.ConstantBuffer);
        originalHdrSampler=device.CreateSamplerState(new SamplerDescription(Filter.MinMagMipLinear,TextureAddressMode.Clamp,TextureAddressMode.Clamp,TextureAddressMode.Clamp));
    }

    /// <summary>
    /// Binds a floating point scene target. Each source pass must explicitly
    /// use its original HDR Write/Read inputs; the target does not guess them.
    /// </summary>
    private void BeginOriginalHdr(int width,int height,Color4 clear)
    {
        if(originalHdrTexture is null||originalHdrWidth!=width||originalHdrHeight!=height)
        {
            context.OMSetRenderTargets(Array.Empty<ID3D11RenderTargetView>());
            originalHdrView?.Dispose();originalHdrTarget?.Dispose();originalHdrTexture?.Dispose();
            originalHdrTexture=device.CreateTexture2D(Format.R16G16B16A16_Float,(uint)width,(uint)height,mipLevels:1,
                bindFlags:BindFlags.RenderTarget|BindFlags.ShaderResource);
            originalHdrTarget=device.CreateRenderTargetView(originalHdrTexture);
            originalHdrView=device.CreateShaderResourceView(originalHdrTexture);
            originalHdrWidth=width;originalHdrHeight=height;
        }
        context.OMSetRenderTargets(originalHdrTarget!);
        context.ClearRenderTargetView(originalHdrTarget!,clear);
    }

    /// <summary>Default original U2 final composite; does not include bloom/LUT.</summary>
    private void EndOriginalHdr(ID3D11RenderTargetView destination)
    {
        if(originalHdrView is null)throw new InvalidOperationException("原HDR场景缓冲区尚未建立。");
        context.OMSetRenderTargets(destination);context.OMSetBlendState(null);
        context.RSSetViewport(new Viewport(originalHdrWidth,originalHdrHeight));
        context.IASetInputLayout(null);context.IASetPrimitiveTopology(PrimitiveTopology.TriangleList);
        context.VSSetShader(originalHdrVs);context.PSSetShader(originalHdrPs);
        context.UpdateSubresource<System.Numerics.Vector4>(GalaxyOriginalHdr.Constants(originalHdrWidth,originalHdrHeight),originalHdrConstants);
        context.PSSetConstantBuffer(7,originalHdrConstants);context.PSSetShaderResource(17,originalHdrView);
        context.PSSetSampler(2,originalHdrSampler);context.Draw(3,0);DrawCalls++;
        context.PSSetShaderResource(17,null!);context.PSSetSampler(2,null!);
    }

    private void DisposeOriginalHdr()
    {
        originalHdrVs.Dispose();originalHdrPs.Dispose();originalHdrConstants.Dispose();originalHdrSampler.Dispose();
        originalHdrView?.Dispose();originalHdrTarget?.Dispose();originalHdrTexture?.Dispose();
    }
}