Files
XCEngine/docs/api/resources/material/material.md

5.2 KiB

Material

命名空间: XCEngine::Resources

类型: class

头文件: XCEngine/Resources/Material.h

描述: 材质资源类,管理渲染所需的着色器和属性参数。

概述

Material 是 XCEngine 中的材质资源类,继承自 IResource。它管理材质关联的着色器和各种属性参数(浮点数、向量、整数、布尔值、纹理等),并支持将属性数据打包到常量缓冲区供 GPU 着色器使用。

头文件

#include <XCEngine/Resources/Material.h>

枚举类型

MaterialPropertyType

材质属性类型枚举,定义材质支持的属性数据类型。

描述
Float 单精度浮点数
Float2 二维浮点向量
Float3 三维浮点向量
Float4 四维浮点向量
Int 32位整数
Int2 二维整数向量
Int3 三维整数向量
Int4 四维整数向量
Bool 布尔值
Texture 二维纹理资源
Cubemap 立方体贴图资源

结构体

MaterialProperty

材质属性结构体,存储单个属性的名称、类型和值。

成员 类型 描述
name Containers::String 属性名称标识符
type MaterialPropertyType 属性数据类型
value union Value 属性值联合体,支持 float[4]、int[4]、bool
refCount Core::uint32 引用计数

公共方法表格

资源基类方法

方法 描述
GetType() 返回 ResourceType::Material
GetName() 获取材质名称
GetPath() 获取材质资源路径
GetGUID() 获取全局唯一标识符
IsValid() 检查材质是否有效且已加载
GetMemorySize() 获取材质占用的内存大小
Release() 释放材质所有引用和资源

着色器管理

方法 描述
SetShader 设置材质使用的着色器
GetShader 获取材质关联的着色器指针

属性设置方法

方法 描述
SetFloat 设置浮点属性
SetFloat2 设置二维向量属性
SetFloat3 设置三维向量属性
SetFloat4 设置四维向量属性
SetInt 设置整数属性
SetBool 设置布尔属性
SetTexture 设置纹理属性

属性获取方法

方法 描述
GetFloat 获取浮点属性值,不存在返回 0.0f
GetFloat2 获取二维向量属性值
GetFloat3 获取三维向量属性值
GetFloat4 获取四维向量属性值
GetInt 获取整数属性值,不存在返回 0
GetBool 获取布尔属性值,不存在返回 false
GetTexture 获取纹理属性句柄

常量缓冲区

方法 描述
GetConstantBufferData 获取常量缓冲区原始数据
UpdateConstantBuffer 更新常量缓冲区数据

属性查询与管理

方法 描述
HasProperty 检查指定属性是否存在
RemoveProperty 移除指定属性
ClearAllProperties 清空所有属性和纹理绑定

使用示例

// 通过资源管理器加载材质
ResourceHandle<Material> mat = ResourceManager::Get().Load<Material>("materials/player.mat");

// 设置着色器
ResourceHandle<Shader> shader = ResourceManager::Get().Load<Shader>("shaders/pbr.shader");
mat->SetShader(shader);

// 设置材质属性
mat->SetFloat("roughness", 0.5f);
mat->SetFloat("metallic", 0.0f);
mat->SetFloat3("albedo", Math::Vector3(1.0f, 0.8f, 0.6f));
mat->SetFloat4("emission", Math::Vector4(1.0f, 0.5f, 0.2f, 2.0f));
mat->SetInt("normalScale", 1);
mat->SetBool("receiveShadow", true);

// 设置纹理
ResourceHandle<Texture> albedoTex = ResourceManager::Get().Load<Texture>("textures/albedo.png");
ResourceHandle<Texture> normalTex = ResourceManager::Get().Load<Texture>("textures/normal.png");
ResourceHandle<Texture> roughnessTex = ResourceManager::Get().Load<Texture>("textures/roughness.png");
mat->SetTexture("albedoMap", albedoTex);
mat->SetTexture("normalMap", normalTex);
mat->SetTexture("roughnessMap", roughnessTex);

// 获取属性
float roughness = mat->GetFloat("roughness");
Math::Vector3 albedo = mat->GetFloat3("albedo");
Shader* shader = mat->GetShader();

// 属性查询
if (mat->HasProperty("metallic")) {
    float metallic = mat->GetFloat("metallic");
}

// 更新常量缓冲区供 GPU 使用
mat->UpdateConstantBuffer();
const auto& cbData = mat->GetConstantBufferData();

// 释放材质
mat->Release();

相关文档