3.3 KiB
3.3 KiB
OpenGLShader::Compile()
bool Compile(const void* sourceData,
size_t sourceSize,
const char* entryPoint,
const char* target) override;
bool Compile(const char* vertexSource, const char* fragmentSource);
bool Compile(const char* vertexSource,
const char* fragmentSource,
const char* geometrySource);
bool Compile(const char* source, ShaderType type);
作用
把 GLSL 源码编译并链接成可用的 OpenGL program。
重载 1: 通用 RHI 入口
bool Compile(const void* sourceData,
size_t sourceSize,
const char* entryPoint,
const char* target) override;
当前实现行为
sourceData == nullptr或sourceSize == 0时直接返回falseentryPoint被显式忽略- 把字节流拷贝成
std::string - 先尝试根据
target解析ShaderType - 若失败,再根据源码中的 GLSL 特征词推断:
gl_Position推断为 Vertexgl_FragCoord/gl_FragColor等推断为 Fragmentlayout(local_size_x等推断为 ComputeEmitVertex/gl_in[推断为 Geometry
- 推断成功后,转发到
Compile(const char*, ShaderType)
注意事项
- 这条路径只支持 GLSL 文本,不负责 HLSL 到 GLSL 的翻译
- 类型推断本质上是启发式逻辑,不是强约束编译管线
重载 2: 顶点 + 片元
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: 顶点 + 片元 + 几何
bool Compile(const char* vertexSource,
const char* fragmentSource,
const char* geometrySource);
当前实现行为
- 与双阶段重载流程相同,只是额外创建并编译
GL_GEOMETRY_SHADER - link 成功后删除 vertex / fragment / geometry 三个 shader 对象
- 同样会把
m_uniformsCached置为false
重载 4: 单阶段编译
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
设计说明
这条路径允许“先创建 program,再逐阶段 attach + link”的简单装配流程,所以 OpenGLDevice::CreateShader(...) 的通用 GLSL 路径可以只给一份源码,再由 target / 内容推断阶段类型。