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

3.3 KiB
Raw Blame History

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 == nullptrsourceSize == 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: 顶点 + 片元

bool Compile(const char* vertexSource, const char* fragmentSource);

当前实现行为

  • 创建 GL_VERTEX_SHADERGL_FRAGMENT_SHADER
  • 分别 glShaderSourceglCompileShader
  • 任一阶段编译失败时直接返回 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 / 内容推断阶段类型。

相关文档