Files
2026-07-13 13:13:17 +08:00

112 lines
4.3 KiB
C#

using System;
using System.Runtime.InteropServices;
using SharpDX.Direct3D11;
using T3.Core.Logging;
using T3.Core.Resource;
using Buffer = SharpDX.Direct3D11.Buffer;
namespace T3.Core.Rendering.Material;
/// <summary>
/// Contains all settings and resource views to initialize a draw call with this material
/// </summary>
public class PbrMaterial: IDisposable
{
public string Name;
public ShaderResourceView AlbedoMapSrv;
public ShaderResourceView EmissiveMapSrv;
public ShaderResourceView RoughnessMetallicOcclusionSrv;
public ShaderResourceView NormalSrv;
public PbrParameters Parameters;
public Buffer ParameterBuffer;
public void UpdateParameterBuffer()
{
ResourceManager.SetupConstBuffer(Parameters, ref ParameterBuffer);
}
[StructLayout(LayoutKind.Explicit, Size = Stride)]
public struct PbrParameters
{
[FieldOffset(0)]
public Vector4 BaseColor;
[FieldOffset(4 * 4)]
public Vector4 EmissiveColor;
[FieldOffset(8 * 4)]
public float Roughness;
[FieldOffset(9 * 4)]
public float Specular;
[FieldOffset(10 * 4)]
public float Metal;
[FieldOffset(11 * 4)]
private float __padding;
public const int Stride = 12 * 4;
}
public static PbrMaterial CreateDefault()
{
_defaultRmoTexture = TextureUtils.CreateColorTexture(new Vector4(0f, 0, 1, 0));
_defaultNormalTexture = TextureUtils.CreateColorTexture(new Vector4(0.5f, 0.5f, 1, 0));
BlackPixelSrv = new ShaderResourceView(ResourceManager.Device, PbrContextSettings.BlackPixelTexture);
WhitePixelSrv = new ShaderResourceView(ResourceManager.Device, PbrContextSettings.WhitePixelTexture);
DefaultAlbedoColorSrv = WhitePixelSrv;
DefaultEmissiveColorSrv = new ShaderResourceView(ResourceManager.Device, PbrContextSettings.WhitePixelTexture);
DefaultRoughnessMetallicOcclusionSrv = new ShaderResourceView(ResourceManager.Device, _defaultRmoTexture);
DefaultNormalSrv = new ShaderResourceView(ResourceManager.Device, _defaultNormalTexture);
var newMaterial= new PbrMaterial()
{
Name = "Default",
Parameters = _defaultParameters,
AlbedoMapSrv = DefaultAlbedoColorSrv,
EmissiveMapSrv = DefaultEmissiveColorSrv,
RoughnessMetallicOcclusionSrv = DefaultRoughnessMetallicOcclusionSrv,
NormalSrv = DefaultNormalSrv,
};
newMaterial.UpdateParameterBuffer();
return newMaterial;
}
public static ShaderResourceView BlackPixelSrv { get; set; }
private static readonly PbrParameters _defaultParameters = new()
{
BaseColor = Vector4.One,
EmissiveColor = new Vector4(0, 0, 0, 1),
Roughness = 0.5f,
Specular = 10,
Metal = 0
};
public static ShaderResourceView DefaultEmissiveColorSrv;
public static ShaderResourceView DefaultAlbedoColorSrv;
public static ShaderResourceView WhitePixelSrv;
public static ShaderResourceView DefaultRoughnessMetallicOcclusionSrv;
public static ShaderResourceView DefaultNormalSrv;
public static Texture2D _defaultRmoTexture;
public static Texture2D _defaultNormalTexture;
public void Dispose() => Dispose(true);
protected virtual void Dispose(bool disposing)
{
Log.Debug($"Disposing PbrMaterial {Name}...");
AlbedoMapSrv?.Dispose();
EmissiveMapSrv?.Dispose();
RoughnessMetallicOcclusionSrv?.Dispose();
NormalSrv?.Dispose();
ParameterBuffer?.Dispose();
}
}