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

167 lines
4.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Shader
**命名空间**: `XCEngine::Resources`
**类型**: `class`
**头文件**: `XCEngine/Resources/Shader.h`
**描述**: 着色器资源类,管理着色器源码、编译后的二进制和 uniform/attribute 信息。
## 概述
`Shader` 是 XCEngine 中的着色器资源类,继承自 `IResource`。它管理着色器源码、编译后的二进制数据、着色器类型、语言类型、uniform 列表和 attribute 列表,并持有对应的 RHI 着色器资源指针。
## 头文件
```cpp
#include <XCEngine/Resources/Shader.h>
```
## 枚举类型
### ShaderType
着色器类型枚举。
| 值 | 描述 |
|----|------|
| `Vertex` | 顶点着色器 |
| `Fragment` | 片元着色器 |
| `Geometry` | 几何着色器 |
| `Compute` | 计算着色器 |
| `Hull` | Hull 着色器(曲面细分控制) |
| `Domain` | Domain 着色器(曲面细分评估) |
### ShaderLanguage
着色器语言枚举。
| 值 | 描述 |
|----|------|
| `GLSL` | OpenGL Shading Language |
| `HLSL` | High-Level Shading Language |
| `SPIRV` | SPIR-V 二进制格式 |
## 结构体
### ShaderUniform
Uniform 变量描述。
| 成员 | 类型 | 描述 |
|------|------|------|
| `name` | `Containers::String` | Uniform 名称 |
| `location` | `Core::uint32` | 位置/绑定点 |
| `size` | `Core::uint32` | 大小(字节) |
| `type` | `Core::uint32` | 类型标识 |
### ShaderAttribute
顶点属性描述。
| 成员 | 类型 | 描述 |
|------|------|------|
| `name` | `Containers::String` | 属性名称 |
| `location` | `Core::uint32` | 位置索引 |
| `size` | `Core::uint32` | 大小(字节) |
| `type` | `Core::uint32` | 类型标识 |
## 公共方法
### 基础属性
| 方法 | 描述 |
|------|------|
| `Shader()` | 默认构造函数 |
| `virtual ~Shader()` | 析构函数 |
| `ResourceType GetType() const` | 返回 `ResourceType::Shader` |
| `const Containers::String& GetName() const` | 获取着色器名称 |
| `const Containers::String& GetPath() const` | 获取着色器路径 |
| `ResourceGUID GetGUID() const` | 获取全局唯一标识符 |
| `bool IsValid() const` | 检查着色器是否有效 |
| `size_t GetMemorySize() const` | 获取内存大小 |
| `void Release()` | 释放着色器资源 |
### Release 详细说明
`Release()` 方法释放 Shader 实例持有的所有资源,包括:
- 清空源码字符串 (`m_sourceCode`)
- 清空编译后的二进制数据 (`m_compiledBinary`)
- 清空 Uniform 列表 (`m_uniforms`)
- 清空 Attribute 列表 (`m_attributes`)
- 释放 RHI 着色器资源指针 (`m_rhiResource`)
-`m_isValid` 标记为 `false`
调用此方法后Shader 对象回到无效状态,可被 ResourceManager 回收。
### 类型与语言
| 方法 | 描述 |
|------|------|
| `void SetShaderType(ShaderType type)` | 设置着色器类型 |
| `ShaderType GetShaderType() const` | 获取着色器类型 |
| `void SetShaderLanguage(ShaderLanguage lang)` | 设置着色器语言 |
| `ShaderLanguage GetShaderLanguage() const` | 获取着色器语言 |
### 源码与编译
| 方法 | 描述 |
|------|------|
| `void SetSourceCode(const Containers::String& source)` | 设置源码 |
| `const Containers::String& GetSourceCode() const` | 获取源码 |
| `void SetCompiledBinary(const Containers::Array<Core::uint8>& binary)` | 设置编译后二进制 |
| `const Containers::Array<Core::uint8>& GetCompiledBinary() const` | 获取编译后二进制 |
### Uniform 和 Attribute
| 方法 | 描述 |
|------|------|
| `void AddUniform(const ShaderUniform& uniform)` | 添加 Uniform 描述 |
| `const Containers::Array<ShaderUniform>& GetUniforms() const` | 获取 Uniform 列表 |
| `void AddAttribute(const ShaderAttribute& attribute)` | 添加 Attribute 描述 |
| `const Containers::Array<ShaderAttribute>& GetAttributes() const` | 获取 Attribute 列表 |
### RHI 资源
| 方法 | 描述 |
|------|------|
| `class IRHIShader* GetRHIResource() const` | 获取 RHI 着色器资源 |
| `void SetRHIResource(class IRHIShader* resource)` | 设置 RHI 着色器资源 |
## 使用示例
```cpp
// 加载着色器
ResourceHandle<Shader> vs = ResourceManager::Get().Load<Shader>("shaders/vertex.glsl");
ResourceHandle<Shader> fs = ResourceManager::Get().Load<Shader>("shaders/fragment.glsl");
// 设置类型
vs->SetShaderType(ShaderType::Vertex);
fs->SetShaderType(ShaderType::Fragment);
// 设置语言
vs->SetShaderLanguage(ShaderLanguage::GLSL);
// 设置编译后二进制
vs->SetCompiledBinary(compiledSpirv);
// 添加 Uniform
ShaderUniform uniform;
uniform.name = "modelMatrix";
uniform.location = 0;
uniform.size = sizeof(float) * 16;
uniform.type = 0;
vs->AddUniform(uniform);
// 访问 RHI 资源
RHIShader* rhiShader = vs->GetRHIResource();
```
## 相关文档
- [IResource](../iresource/iresource.md) - 资源基类
- [RHIShader](../../rhi/shader/shader.md) - RHI 着色器接口
- [Material](../material/material.md) - 材质资源
- [Resources 总览](../resources.md) - 返回模块总览