2017-02-03 13 views
0

내 응용 프로그램에서 6x4096x4096 큐브 맵 텍스처 용 밉맵을 생성합니다. 다음으로 시간에 의존하는 텍스처에 대한 다른 변경 사항을 수행해야합니다. 모든 드로잉은 requestAnimationFrame의 루프 내부에서 수행됩니다.generateMipmap이 완료 되었습니까?

브라우저, 장치 등에 따라 경우에 따라 최종적으로 루프의 3 개, 때로는 4 개 또는 5 개의 연속 프레임이 필요하므로 정확히 어떤 밉맵이 이미 수행되었는지 알고 있어야합니다.

질문 : WebGL의 명령 "generateMipmap"에 의해 "TEXTURE_CUBE_MAP"에 대해 생성 된 requestAnimationFrame의 루프 밉맵이 준비되었는지 확인하는 방법은 무엇입니까? "generateMipmap"완료 상태를 확인하기위한 플래그가 있습니까?

답변

1

generateMipmap이 완료 될시기 또는 걸리는 시간을 알 수있는 방법이 없습니다. 그렇게 오래 걸린다면 놀랄 것입니다. 그러나 요점은 당신이 jank를 피하기를 원한다면 하나의 해결책은 당신 자신의 밉을 만드는 것일 것입니다. 이 방법으로 한 프레임 당 한 개의로드를 업로드하거나 심지어는 작은 증분으로 업로드 할 수 있습니다. 단지 추측 크롬은 멀티 프로세스이기 때문에

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은 "동기식"호출입니다. 브라우저는 밉 레벨을 실제로 생성하기 전에 브라우저에서 즉시 반환하여 최적화 할 수 있지만 generateMipmap이라는 텍스쳐를 처음 사용할 때는 밉 레벨을 사용할 준비가되었습니다. 코드에 넣어 :

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 밉 수준의 내용을 변경하면 다시 generateMipmap를 호출해야합니다.

Here's이 동작에 대해 자세히 알아보십시오.

+0

답장을 보내 주셔서 감사합니다. 내 문제는 WebGL 명령의 순서가 아니라 requestAnimationFrame의 루프 동작입니다. 프레임 번호 0에서 "generateMipmap"을 호출한다고 가정 해 보겠습니다. 그러면 밉맵 생성을 완료하는 데 필요한 프레임 수를 알고 싶습니다. 마지막 프레임에서는 drawArrays와 같은 함수를 호출하고 싶습니다. ". 사전에 정확한 프레임 수를 알 필요는 없지만 작업 (밉맵 생성)이 완료되면 일종의 "if"문을 사용하여 확인해야합니다. –

+0

API가 없습니다. 앞서 말했듯이'generateMipmap'은 완료 될 때까지 잠글 수 있습니다. 또한 사용자의 하드웨어가 중요한 역할을하므로 밉 레벨 생성 프레임 수를 안정적으로 얻을 수있는 방법도 없습니다. 빈번히 밉맵을 재생성 할 필요가 없다면 같은 프레임 (또는 다음 프레임)의 텍스처를 사용하는 것이 좋습니다. 텍스처를 자주 업데이트해야하는 경우 밉맵 사용을 피하는 방법을 찾는 것이 좋습니다. –

+0

내가 무엇을 필요로하는지 (언뜻보기에는 이상하게 보일 수도 있음) 이유는 "drawArrays"와 같은 호출에 전달되는 시간 매개 변수 t를 사용하고 있기 때문입니다. "generateMipmap"이 (프레임에서) 완료 될 때를 알아야하므로 "drawArrays (t)"t의 올바른 값 (requestAnimationFrame의 루프의 각 프레임 지속 시간 측정)을 전달할 수 있습니다. –