Трудно сказать, в чем проблема из этого куска кода, но позвольте мне высказать несколько предложений, чтобы попытаться помочь вам найти проблему.
Прежде всего, вы не знаетенужно слишком много беспокоиться о том, чтобы делать disableVertexAttribArray каждый раз, когда вы переключаете шейдеры.Включенные / отключенные массивы - это состояние, связанное с шейдером, и поэтому изменение связанной программы в любом случае делает недействительными ваши ранее включенные массивы.
(На самом деле, кто-нибудь знает, достойную цитату для этого, я пыталсянайти его и не могу в данный момент.)
Имея это в виду, вы можете упростить приведенный выше код до:
GLWrapProto.switchQuadProgram = function ()
{
var gl = this.gl;
gl.useProgram(this.shaderProgram);
gl.enableVertexAttribArray(this.locAPos);
gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer);
gl.vertexAttribPointer(this.locAPos, 2, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(this.locATex);
gl.bindBuffer(gl.ARRAY_BUFFER, this.texcoordBuffer);
gl.vertexAttribPointer(this.locATex, 2, gl.FLOAT, false, 0, 0);
};
GLWrapProto.switchPointProgram = function ()
{
var gl = this.gl;
gl.useProgram(this.shaderProgramPoint);
gl.enableVertexAttribArray(this.locAPosPoint);
gl.bindBuffer(gl.ARRAY_BUFFER, this.pointBuffer);
gl.vertexAttribPointer(this.locAPosPoint, 4, gl.FLOAT, false, 0, 0);
};
Мне любопытно, о какой проблеме вы упомянули"глюки дисплея", хотя.Я не могу придумать причину, по которой переключение шейдеров может привести к случайной остановке объектов и началу рендеринга.Попробуйте сначала отрисовать только геометрию, используя один шейдер, затем переключитесь и отрендерируйте только геометрию, которая использует другой.Если у любого из них есть проблема, то вы знаете, что проблема не в переключении шейдеров.Если проблема возникает только при рендеринге обоих наборов геометрии, между ними может быть какая-то ошибка в управлении состоянием.