Вы написали шейдер, который читается из блока текстуры; вы, как правило, избегаете условий в шейдерах, так как они потенциально разделяют путь выполнения. Обычно компилятор может понять это, если вещь, на которую вы действуете условно, является единообразной, но вы можете заплатить за перекомпиляцию каждый раз, когда вы устанавливаете форму. ES-не имеют средств интроспекции текущих свойств единицы выборки таким образом, на первый взгляд решения может быть что-то вроде:
uniform bool u_ApplyTexture;
...
if(u_ApplyTexture)
gl_FragColor = {what you already have};
else
gl_FragColor = v_Color;
Не-условная альтернатива, возможно, к профилю в качестве альтернативы может быть:
uniform float u_TextureWeight;
...
gl_FragColor = v_Color*
mix(vec4(1.0),
texture2D(u_TextureUnit, v_TextureCoordinates),
u_TextureWeight);
Как это будет оцениваться до v_Color*vec4(1.0)
, когда u_TextureWeight
является 0.0
и v_Color*texture2D(u_TextureUnit, v_TextureCoordinates)
, когда u_TextureWeight
является 1.0
.
Если вы действительно хотите быть Hacky, вы можете просто загрузить свои текстуры, как негативные образы и отрицательные их снова в шейдере:
gl_FragColor = v_Color*(vec4(1.0) - texture2D(u_TextureUnit, v_TextureCoordinates));
Как и тогда, очевидно, если вы получаете vec4(0.0)
от единицы выборки потому что никакая текстура не прикреплена, которая заканчивается умножением v_Color
на 1.0
.
Я бы придерживался первого не-хакерского решения :) Или используйте два разных шейдера ... – 246tNt
Действительно. Самая простая вещь сначала, всегда. Добавьте сложность только в той степени, в которой производительность диктует ее необходимость. – Tommy
Идеальный ответ, спасибо – Mohamed