2017-02-03 2 views
0

В моем приложении я генерирую mipmaps для текстуры куба 6x4096x4096. Затем мне нужно предпринять некоторые другие изменения в этой текстуре, зависящие от времени. Весь чертеж выполняется внутри цикла requestAnimationFrame.Выполняется ли генерация Mipmap?

В зависимости от браузера, устройства и т. Д. Иногда требуется три, иногда четыре или даже пять последовательных кадров цикла, чтобы, наконец, сгенерировать эти mipmaps, и мне нужно знать, в каком кадре уже выполняются именно mipmaps.

Итак, вопрос в том, как проверить, в каком кадре запрограммированных mipmaps цикла requestAnimationFrame, сгенерированных для команды «TEXTURE_CUBE_MAP» командой WebGL «generateMipmap», готовы? Есть ли какой-либо флаг для проверки состояния завершения «generateMipmap»?

ответ

1

Невозможно узнать, когда generateMipmap закончится или как долго это займет. Я был бы удивлен, что это займет так много времени, но если дело в том, что вы хотите избежать jank, одно решение - это сделать ваших собственных мам. Таким образом, вы можете загрузить их по одному лоду на каждый кадр или даже в меньших приращениях.

одно возможное решение, но, вероятно, работает только на Chrome является только гадать и ждать несколько кадров с кодом, как

gl.generateMipmap(...); 
gl.flush(); // make sure the previous command will be executed 

// now do something to wait 4 frames like 
var framesToWait = 4; 
function render() { 
    if (framesToWait) { 
    --framesToWait; 
    } else { 
    ... call drawArrays ... 
    } 
    requestAnimationFrame(render); 
} 
requestAnimationFrame(render); 

Этот мог бы работу, потому что хром является многозадачность. Я не уверен, что будет.

В WebGL2 вы можете использовать объект FenceSync, чтобы узнать, когда что-то закончилось.

0

generateMipmap является «синхронным» вызовом. В то время как браузеры могут попытаться оптимизировать его, вернувшись из него немедленно, прежде чем генерировать уровни mip, на самом деле сделано первое использование текстуры, для которой было вызвано generateMipmap, убедитесь, что mip-levels're готовы к использованию. Для того, чтобы поместить его в код:

const texture = gl.createTexture(); 
gl.activeTexture(gl.TEXTURE0); 
gl.bindTexture(gl.TEXTURE_2D, texture); 
gl.texImage2D(gl.TEXTURE_2D, /* ... */); 
gl.generateMipmap(gl.TEXTURE_2D); 
gl.uniform1i(someSamplerUniform, 0); 
gl.drawArrays(/* ... */); // Here WebGL implementation will make sure that 
          // mip-levels for tetxure are ready. If they aren't, 
          // this call will cause blocking. 

Если изменить содержание 0 MIP-уровень текстуры, вам нужно вызвать generateMipmap снова.

Here's немного больше информации об этом поведении.

+0

Благодарим вас за ответ. Моя проблема связана не с порядком команд WebGL, а с поведением цикла requestAnimationFrame. Предположим, что я вызываю «generateMipmap» на номер кадра 0. Затем я хотел бы знать, сколько фреймов потребуется для завершения генерации mipmaps, потому что в последнем из этих фреймов я хотел бы вызвать функцию типа drawArrays ». Мне не нужно знать точное количество кадров по заранее, просто нужно проверить с помощью какого-то оператора «if», когда задание (сгенерирование mipmaps) выполняется. –

+0

Для этого нет API. Более того, как я уже сказал, 'generateMipmap' может блокироваться, пока это не будет сделано. Кроме того, аппаратное обеспечение пользователя играет здесь значительную роль, поэтому также невозможно обеспечить надежное получение количества кадров, генерирующих уровни mip. Если вам не нужно часто обновлять mipmaps, я предлагаю просто использовать текстуру в том же фрейме (или, возможно, в следующем). Если вам нужно часто обновлять текстуры, есть смысл искать способы избежать использования mipmaping. –

+0

Причина того, что мне нужно (что может показаться странным на первый взгляд), заключается в том, что я использую некоторый параметр времени t, который я передаю в вызов типа drawArrays. Мне нужно знать, когда делается «generateMipmap» (в каком кадре), поэтому я могу передать «drawArrays (t)» правильное значение t (I измерять продолжительность каждого кадра цикла requestAnimationFrame). –

Смежные вопросы