2026-03-28 01:11:07 +08:00
|
|
|
|
# OpenGLShader::Compile()
|
2026-03-26 16:45:24 +08:00
|
|
|
|
|
|
|
|
|
|
```cpp
|
2026-03-28 01:11:07 +08:00
|
|
|
|
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);
|
2026-03-28 01:11:07 +08:00
|
|
|
|
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-27 22:09:58 +08:00
|
|
|
|
## 作用
|
2026-03-26 16:45:24 +08:00
|
|
|
|
|
2026-03-28 01:11:07 +08:00
|
|
|
|
把 GLSL 源码编译并链接成可用的 OpenGL program。
|
2026-03-26 16:45:24 +08:00
|
|
|
|
|
2026-03-28 01:11:07 +08:00
|
|
|
|
## 重载 1: 通用 RHI 入口
|
2026-03-26 16:45:24 +08:00
|
|
|
|
|
2026-03-28 01:11:07 +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
|
|
|
|
|
2026-03-28 01:11:07 +08:00
|
|
|
|
### 设计说明
|
2026-03-27 22:09:58 +08:00
|
|
|
|
|
2026-03-28 01:11:07 +08:00
|
|
|
|
这条路径允许“先创建 program,再逐阶段 attach + link”的简单装配流程,所以 `OpenGLDevice::CreateShader(...)` 的通用 GLSL 路径可以只给一份源码,再由 `target` / 内容推断阶段类型。
|
2026-03-26 16:45:24 +08:00
|
|
|
|
|
|
|
|
|
|
## 相关文档
|
|
|
|
|
|
|
2026-03-27 22:09:58 +08:00
|
|
|
|
- [CompileFromFile](CompileFromFile.md)
|
2026-03-28 01:11:07 +08:00
|
|
|
|
- [CompileCompute](CompileCompute.md)
|
|
|
|
|
|
- [GetType](GetType.md)
|
|
|
|
|
|
- [OpenGLShader](OpenGLShader.md)
|