Ничто не приходит на ум, сразу же взглянув на ваш код, но я хотел бы воспользоваться моментом и указать, что этот вариант использования может быть рассмотрен без использования оператора if. Например, давайте обработаем uUseTexture
как число с плавающей точкой вместо целого (вы могли бы привести его в шейдер, но это более интересно):
// Vertex
attribute vec3 aVertexPosition;
attribute vec4 aVertexColor;
attribute vec2 aTextureCoord;
uniform mat4 uMVMatrix;
uniform mat4 uPMatrix;
varying vec4 vColor;
varying vec2 vTextureCoord;
void main(void) {
gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
// It may actually be faster to just assign both of these anyway
vTextureCoord = aTextureCoord;
vColor = aVertexColor;
}
// Фрагмент
uniform float uUseTexture;
uniform sampler2D uSampler;
varying vec4 vColor;
varying vec2 vTextureCoord;
void main(void) {
// vTextureCoord is already a vec2, BTW
vec4 texColor = texture2D(uSampler, vTextureCoord) * uUseTexture;
vec4 vertColor = vColor * (1.0 - uUseTexture);
gl_FragColor = texColor + vertColor;
}
Теперь uUseTexture просто действует как модулятор для того, сколько из каждого источника цвета вы хотите использовать. И это более гибко, так как вы можете установить его на 0,5 и получить также половину текстуры / половину вершины!
Что вас может удивить, так это то, что есть большая вероятность того, что именно так шейдер-компилятор и делает за кадром, когда вы используете оператор if, подобный этому. Обычно это более эффективно для аппаратного обеспечения.