我花了很多时间调整着色器,我想快速重新加载着色器而不重新编译我的程序。在OpenGL 4.1中热重新加载着色器的官方方法是什么?
这是我目前的(非功能性)方法:
创建一个程序管道,为每个着色器创建一个可分离的程序(现在它只是一个顶点和一个片段)并在管道中使用它。将制服加载到需要它的每个程序中(有没有办法模仿着色器共享的一个统一的旧样式?)
glGenProgramPipelines(1, &programPipeline);
glBindProgramPipeline(programPipeline); //is this necessary?
auto handle = glCreateShader(type);
const char* src = source.c_str();
glShaderSource(handle, 1, &src, NULL);
glCompileShader(handle);
program[idx] = glCreateProgram();
__glewProgramParameteri(program[idx], GL_PROGRAM_SEPARABLE, GL_TRUE); //xcode auto corrected this for me
glAttachShader(program[idx], handle);
glLinkProgram(program[idx]);
glDetachShader(program[idx], handle);
glUseProgramStages(programPipeline, shaderStage,
program[idx]);
我坚持的部分是如何处理属性。它失败了" GL_INVALID_OPERATION"当我尝试在正常的不可分离程序中启用顶点属性数组时,它可以正常工作。在尝试启用顶点属性数组之前,我已经生成并绑定了一个vao并获得了attrib位置。我发现的在线资源只提到了与可分离程序相关的制服,但没有涉及属性。它们甚至可以用于可分离的程序吗?会有什么替代方案?