Вам не нужно создавать новые шейдеры.Вам нужно позвонить gl.shaderSource
, чтобы загрузить новый GLSL, а затем gl.compileShader
и gl.linkShader
.
Это сложная часть спецификации.Что вы пытаетесь сделать?
Если ссылка не работает с вашей программой, программа больше не используется.Если ссылка установлена успешно, у вас фактически есть новая программа, и вам нужно искать все новые атрибуты и единообразные местоположения.
Вы можете создавать новые шейдеры, если хотите, и присоединять их к существующей программе.Перед тем, как прикрепить новые шейдеры, вам нужно отсоединить старые с gl.detachShader(prg, oldShader)
, но вы не уверены, что это полезно, но вы можете думать о внутреннем состоянии WebGLProgram
, как это
class WebGLProgram {
Shader vertexShader;
Shader fragmentShader;
// status from last time you called gl.linkProgram
int linkStatus;
// message from last time you called gl.linkProgram
string infoLog;
// internal program created by last SUCCESSFUL linkProgram
Program validProgram;
}
class Program {
map<string, int> attribLocations;
map<string, WebGLUniformLocation> uniformLocations;
GPUProgramCode compiledProgram
}
class Shader {
string src;
// status from last time you called gl.compileShader
int compileStatus;
// message from last time you called gl.compileShader
string infoLog;
// internal shader created from last successful compile
GPUShaderCode compiledShader;
}
.единственное, что имеет значение при рендеринге, это то, что validProgram
на WebGLProgram
имеет действующую программу.Так, например,
const prg = gl.createProgram();
gl.attachShader(prg, validCompiledVertexShader);
gl.attachShader(prg, validCompiledFragmentShader);
gl.linkProgram(prg);
// our imaginary prg.validProgram now has a valid program
gl.detachShader(prg, validCompiledVertexShader);
gl.detachShader(prg, validCompiledFragmentShader);
gl.deleteShader(validCompiledVertexShader);
gl.deleteShader(validCompiledFragmentShader);
Это совершенно правильный способ использования шейдеров.Им нужно только остаться достаточно долго, чтобы позвонить linkProgram
.