В большинстве игр, которые я видел с описанным вами поведением, они обычно начинаются либо с раскраски на каждую вершину, либо с ОЧЕНЬ текстурой с низким разрешением и «смешиваются» с полной текстурой, когда она становится доступной. Такой плавный переход довольно сложен, но если все, что вам нужно, это быстрое «всплытие» от одного к другому, это не должно вызвать особых проблем.
Основной маршрут, который я выбрал бы, - это создание буфера вершин, который бы имел как текстурную координату, так и информацию о цвете, а также два разных шейдера. Один шейдер будет использовать информацию о цвете, другой проигнорирует ее и вместо этого будет использовать текстуру. Вы дадите сигнал мешу, чтобы начать использовать текстурный, как только текстура будет готова.
Что касается определения загрузки изображения, это совсем не сложно, и вам даже не нужен AJAX для этого:
var image = new Image();
image.addEventListener("load", function() {
// Image is done loading, push to texture
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
// Set up any other state needed, such as switching the shader for the mesh
}, true);
image.src = src;
Я не уверен, насколько большую помощь я могу оказать по этому вопросу, не публикуя действительно большие блоки кода, но если вы все еще испытываете затруднения, я могу подробно рассказать о некоторых других частях.