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();
}
}
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();
}
}