75 lines
2.2 KiB
Markdown
75 lines
2.2 KiB
Markdown
|
|
# ShaderLoader::Load
|
|||
|
|
|
|||
|
|
## 方法签名
|
|||
|
|
|
|||
|
|
```cpp
|
|||
|
|
LoadResult Load(const Containers::String& path, const ImportSettings* settings = nullptr) override;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 详细描述
|
|||
|
|
|
|||
|
|
加载指定路径的着色器资源文件。加载过程包括:
|
|||
|
|
|
|||
|
|
1. 读取文件数据
|
|||
|
|
2. 将二进制数据转换为字符串形式的着色器源代码
|
|||
|
|
3. 创建 `Shader` 对象并设置基本信息(路径、名称、GUID)
|
|||
|
|
4. 根据文件扩展名检测着色器语言(HLSL 或 GLSL)
|
|||
|
|
5. 根据文件扩展名检测着色器类型(顶点、片段、几何、计算)
|
|||
|
|
6. 设置着色器源代码和有效性标志
|
|||
|
|
7. 计算并设置资源的内存占用
|
|||
|
|
|
|||
|
|
**语言检测规则:**
|
|||
|
|
- `.hlsl` 扩展名 → `ShaderLanguage::HLSL`
|
|||
|
|
- 其他扩展名 → `ShaderLanguage::GLSL`
|
|||
|
|
|
|||
|
|
**类型检测规则:**
|
|||
|
|
- `.vert` → `ShaderType::Vertex`
|
|||
|
|
- `.frag` → `ShaderType::Fragment`
|
|||
|
|
- `.geom` → `ShaderType::Geometry`
|
|||
|
|
- `.comp` → `ShaderType::Compute`
|
|||
|
|
- 其他扩展名 → `ShaderType::Fragment`(默认)
|
|||
|
|
|
|||
|
|
## 参数
|
|||
|
|
|
|||
|
|
| 参数 | 类型 | 默认值 | 描述 |
|
|||
|
|
|------|------|--------|------|
|
|||
|
|
| path | `const Containers::String&` | - | 着色器文件路径 |
|
|||
|
|
| settings | `const ImportSettings*` | `nullptr` | 导入设置(当前未使用) |
|
|||
|
|
|
|||
|
|
## 返回值
|
|||
|
|
|
|||
|
|
`LoadResult` - 加载结果对象,包含成功加载的 `Shader` 指针或错误信息
|
|||
|
|
|
|||
|
|
## 示例
|
|||
|
|
|
|||
|
|
```cpp
|
|||
|
|
#include "Resources/ShaderLoader.h"
|
|||
|
|
|
|||
|
|
using namespace XCEngine::Resources;
|
|||
|
|
|
|||
|
|
ShaderLoader loader;
|
|||
|
|
|
|||
|
|
// 加载顶点着色器
|
|||
|
|
LoadResult vertResult = loader.Load("assets/shaders/pbr.vert");
|
|||
|
|
if (vertResult.IsSuccess()) {
|
|||
|
|
Shader* vertShader = static_cast<Shader*>(vertResult.GetResource());
|
|||
|
|
printf("Loaded vertex shader: %s\n", vertShader->m_name.CStr());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 加载片段着色器
|
|||
|
|
LoadResult fragResult = loader.Load("assets/shaders/pbr.frag");
|
|||
|
|
if (fragResult.IsSuccess()) {
|
|||
|
|
Shader* fragShader = static_cast<Shader*>(fragResult.GetResource());
|
|||
|
|
printf("Loaded fragment shader: %s\n", fragShader->m_name.CStr());
|
|||
|
|
} else {
|
|||
|
|
printf("Failed to load fragment shader: %s\n", fragResult.GetError().CStr());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 加载 HLSL 着色器
|
|||
|
|
LoadResult hlslResult = loader.Load("assets/shaders/vertex.hlsl");
|
|||
|
|
if (hlslResult.IsSuccess()) {
|
|||
|
|
Shader* hlslShader = static_cast<Shader*>(hlslResult.GetResource());
|
|||
|
|
// HLSL 着色器...
|
|||
|
|
}
|
|||
|
|
```
|