На данный момент опустим возможность создания пользовательских материалов.
Забудем про material instance, без отслеживания дерева override это не имеет большого смысла.
Аналогично UE. При создании пользователь имеет возможность выбрать следующие свойства материала:
Blend mode:
Opaque
Translucent
Shading model
Default lit
Unlit
Возможные парамеры
Рассмотрим все параметры и их тип, которые может иметь материал.
Base color
float3
Texture
Metallic
float
Texture + channel
Specular
float
Texture + channel
Roughness
float
Texture + channel
Anisotropy
float
Texture + channel
Emissive Color
float3
Texture
Opacity
float
Texture + channel
Normal
Texture Or None
Tangent А надо ли
Зависимость параметров от свойств
Для каждой комбинации свойств рассмотрим возможные параметры:
Opaque x Default lit:
Base color
Metallic
Specular
Roughness
Anisotropy
Emissive Color
Normal
Tangent
Opaque x Unlit:
Emissive Color
Translucent х Default lit:
Base color
Emissive Color
Opacity
Translucent х Unlit:
Emissive Color
Opacity
Diagram
PlantUML
@startuml
class Material <>
{
MaterialID
BlendMode
ShadingMode
Base color : TextureColor
Metallic : TextureСhannel
Specular : TextureСhannel
Roughness : TextureСhannel
Anisotropy : TextureСhannel
Emissive Color : TextureСhannel
Opacity : TextureСhannel
Normal : TextureID
ShaderResources* <>
}
class TextureColor <>
{
TextureID Texture
Float3 Color
}
class TextureChannel <>
{
TextureID Texture
UINT Channel
}
class RuntimeResourceManager
{
void LoadMaterial(MaterialID)
State Verify(TextureID) <>
}
class PSOManager
{
+ ShaderResources* CreateShaderResourcesFor(Material*)
}
Material .. ShaderResource
Material "1" *-- "0..*" TextureColor : uses
Material "1" *-- "0..*" TextureChannel : uses
note as TextureIDNote
TextureID may be invalid
end note
TextureIDNote .. TextureColor
TextureChannel .. TextureIDNote
note as NoteInit
RRM::LoadMaterial(MaterialID)
in editor:
For all properties
RRM::Verify(TextureID) == Loaded
PSO::CreateShaderResourcesFor(Material*)
end note
NoteInit .. Material
NoteInit .. RuntimeResourceManager
NoteInit .. PSOManager
@enduml
Code
Поскольку каждая комбинация имеет свой набор ресурсов, нужно согласовать их layout с #81, для этого хочется иметь функцию:
PSO::CreateShaderResourcesFor(Material) (поскольку в #69 также отправляется Material)
16
LoadMaterial(MaterialID)
for editor only Verify(TextureID) -- для отслеживания потерянных ресурсов
65
83
Use Case
На данный момент опустим возможность создания пользовательских материалов. Забудем про material instance, без отслеживания дерева override это не имеет большого смысла. Аналогично UE. При создании пользователь имеет возможность выбрать следующие свойства материала:
Возможные парамеры
Рассмотрим все параметры и их тип, которые может иметь материал.
Зависимость параметров от свойств
Для каждой комбинации свойств рассмотрим возможные параметры:
Diagram
PlantUML
@startuml class Material <Code
16