2016-12-07 2 views

답변

4

먼저 OpenGL에 SwapBuffers가 없습니다. SwapBuffers is a platform specific thing that is not part of OpenGL.

어떤 경우에도 SwapBuffers에 해당하는 것이 WebGL에서 암시 적이지만. drawingbuffer (예 : drawArray, drawElements, clear ...)에 영향을주는 WebGL 함수를 호출하면 다음에 브라우저가 페이지를 합성 할 때 효과적으로 "swapbuffers"됩니다.

사실 "교환"또는 "복사"여부는 브라우저에 달려 있습니다. 예를 들어 앤티 엘리 어싱이 활성화 된 경우 (기본값) 브라우저는 내부적으로 브라우저가 내부 멀티 샘플 버퍼를 실제로 표시 될 수있는 것으로 변환하는 "복사"또는 "블릿"을 효과적으로 수행합니다.

또한 스왑이 암시 적이기 때문에 WebGL은 다음 렌더링 명령 전에 drawingBuffer를 지 웁니다. 이것은 브라우저가 내부적으로 스왑하거나 복사하기로 결정했는지에 관계없이 동작을 일관되게 만드는 것입니다.

{preserveDrawingBuffer: true}getContext에 두 번째 매개 변수로 전달하여 스왑 대신 사본을 강제로 (그리고 지우는 것을 방지 할 수 있습니다.) 물론 스왑을 허용하지 않는 비용이 많이 듭니다.

또한 스왑 자체 및 발생시기는 반 정의되지 않습니다. 즉 gl.drawXXX 또는 gl.clear을 호출하면 브라우저에 다음 번 컴포지트에서 스왑/복사하도록 지시하지만 그 시간과 브라우저가 실제로 다른 이벤트를 합성하는 시간 사이에 처리 될 수 있습니다. 스왑은 현재 이벤트가 종료 될 때까지 발생합니다 (예 : requestAnimationFrame 이벤트). 이벤트가 종료되는 시간과 브라우저에서 더 많은 이벤트를 합성하는 시간 (예 : mousemove) 사이에 스왑이 발생합니다.

{preserveDrawingBuffer: true}을 사용하지 않으면 한 이벤트 동안 항상 모든 그림을 처리해야합니다. 대개 requestAnimationFrame입니다. 그렇지 않으면 일치하지 않는 결과가 발생할 수 있습니다.

1

AFAIK, swap buffers 전화는 일반적으로 GL 상태로 변경되지 않습니다. 그리기 호출 사이에 그 상태를 변경하는 GL 호출이 많이 있습니다. 버퍼 스와핑에 관해서는, 브라우저는 렌더링 코드가 반환 된 콜백 이후에 언젠가 당신을 위해 그것을 수행한다. (그렇다. 실제로 일어날 직접 컨트롤은 없다.

관련 문제