繁体   English   中英

在着色器程序中重新编译,重新链接,顶点着色器

[英]Recompile, relink, vertex shader in shader program

我有一个用于检测对我的着色器文件所做的更改的系统。 当着色器发生变化时,例如顶点着色器,我想编译该着色器并用旧版本替换它(同时更改着色器的输入/输出,从而重新使用VAO,VBO等)。

std::pair<bool, std::string> Shader::recompile() {
std::string vertex_src = load_shader_source(vertex_filepath);

glDetachShader(gl_program, vertex_shader); // gl_program is a GLuint for the shader program
glDeleteShader(vertex_shader);

vertex_shader = glCreateShader(GL_VERTEX_SHADER);

auto raw_str = vertex_src.c_str();
glShaderSource(vertex_shader, 1, &raw_str, NULL);

glCompileShader(vertex_shader);

GLint vertex_shader_status;
glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &vertex_shader_status);

GLint fragment_shader_status = 1;

if (vertex_shader_status == 1) {
    glAttachShader(gl_program, vertex_shader);
    // glLinkProgram(gl_program);

    // Logging - mostly irrelevant to the question
    GLint is_linked = 0;
    glGetProgramiv(gl_program, GL_LINK_STATUS, &is_linked);
    SDL_Log("Shader relinking is success: %i", is_linked == GL_TRUE);

    std::string err_log = "";
    GLint max_log_lng = 0;
    glGetProgramiv(gl_program, GL_INFO_LOG_LENGTH, &max_log_lng);
    err_log.reserve(max_log_lng);
    glGetProgramInfoLog(gl_program, max_log_lng, NULL, (char *) err_log.c_str());
    SDL_Log("%s", err_log.c_str());

    return {true, ""};
}

使用这种方法的结果是什么都没有改变,但是当我链接程序时(在if语句中),它就消失了。 我假设这是因为链接会更改所有绑定,从而使现有绑定无效,从而导致根本没有呈现任何内容。

因此,是否有可能在着色器程序中像这样交换特定的着色器?

链接不会使任何属性绑定无效,因为它们是VAO状态的一部分,而不是程序的一部分。 重新链接程序时可能会发生两件事:

  • 属性的索引可能会更改。 这可通过它们在两个着色器固定(防止layout (location=...)或通过编译和加载(之间固定它们glBindAttribLocation​ )。 制服也可能发生相同的事情,并且可以以相同的方式处理。
  • 制服的价值会丢失。 不能简单地防止这种情况,但是在每帧中设置它们应该可以解决该问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM