Files
XCEngine/docs/api/XCEngine/RHI/OpenGL/OpenGLShader/Compile.md

113 lines
3.3 KiB
Markdown
Raw Normal View History

# OpenGLShader::Compile()
2026-03-26 16:45:24 +08:00
```cpp
bool Compile(const void* sourceData,
size_t sourceSize,
const char* entryPoint,
const char* target) override;
2026-03-26 16:45:24 +08:00
bool Compile(const char* vertexSource, const char* fragmentSource);
bool Compile(const char* vertexSource,
const char* fragmentSource,
const char* geometrySource);
2026-03-26 16:45:24 +08:00
bool Compile(const char* source, ShaderType type);
```
## 作用
2026-03-26 16:45:24 +08:00
把 GLSL 源码编译并链接成可用的 OpenGL program。
2026-03-26 16:45:24 +08:00
## 重载 1: 通用 RHI 入口
2026-03-26 16:45:24 +08:00
```cpp
bool Compile(const void* sourceData,
size_t sourceSize,
const char* entryPoint,
const char* target) override;
```
### 当前实现行为
- `sourceData == nullptr``sourceSize == 0` 时直接返回 `false`
- `entryPoint` 被显式忽略
- 把字节流拷贝成 `std::string`
- 先尝试根据 `target` 解析 `ShaderType`
- 若失败,再根据源码中的 GLSL 特征词推断:
- `gl_Position` 推断为 Vertex
- `gl_FragCoord` / `gl_FragColor` 等推断为 Fragment
- `layout(local_size_x` 等推断为 Compute
- `EmitVertex` / `gl_in[` 推断为 Geometry
- 推断成功后,转发到 `Compile(const char*, ShaderType)`
### 注意事项
- 这条路径只支持 GLSL 文本,不负责 HLSL 到 GLSL 的翻译
- 类型推断本质上是启发式逻辑,不是强约束编译管线
## 重载 2: 顶点 + 片元
```cpp
bool Compile(const char* vertexSource, const char* fragmentSource);
```
### 当前实现行为
- 创建 `GL_VERTEX_SHADER``GL_FRAGMENT_SHADER`
- 分别 `glShaderSource``glCompileShader`
- 任一阶段编译失败时直接返回 `false`
- 编译通过后创建新的 `m_program`
- attach 两个 shader 并 link
- link 成功后删除临时 shader 对象
-`m_uniformsCached` 置为 `false`
### 注意事项
- 这条路径不会更新 `m_type`
- 如果对象之前已经持有旧 `m_program`,当前实现不会先 `Shutdown()`,因此重复编译不属于严格意义上的“就地重编译”
- 失败路径没有对所有临时 OpenGL 对象做完整清理
## 重载 3: 顶点 + 片元 + 几何
```cpp
bool Compile(const char* vertexSource,
const char* fragmentSource,
const char* geometrySource);
```
### 当前实现行为
- 与双阶段重载流程相同,只是额外创建并编译 `GL_GEOMETRY_SHADER`
- link 成功后删除 vertex / fragment / geometry 三个 shader 对象
- 同样会把 `m_uniformsCached` 置为 `false`
## 重载 4: 单阶段编译
```cpp
bool Compile(const char* source, ShaderType type);
```
### 当前实现行为
-`type` 创建对应 shader
- Vertex
- Fragment
- Geometry
- Compute
- TessControl
- TessEvaluation
-`m_program == 0`,先创建 program
- attach 当前阶段 shader 并立即 link
- 成功后删除临时 shader
-`m_type` 设置为传入的 `type`
-`m_uniformsCached` 置为 `false`
2026-03-26 16:45:24 +08:00
### 设计说明
这条路径允许“先创建 program再逐阶段 attach + link”的简单装配流程所以 `OpenGLDevice::CreateShader(...)` 的通用 GLSL 路径可以只给一份源码,再由 `target` / 内容推断阶段类型。
2026-03-26 16:45:24 +08:00
## 相关文档
- [CompileFromFile](CompileFromFile.md)
- [CompileCompute](CompileCompute.md)
- [GetType](GetType.md)
- [OpenGLShader](OpenGLShader.md)