방금 OpenGL specification for ARB_map_buffer_range
을 찾았습니다.Opengl 비 동기화/비 차단 MAP
이 확장 프로그램을 사용하여 비 차단지도 통화를 할 수 있는지 궁금합니다.
현재 내 응용 프로그램에서 FBO로 렌더링 한 다음 호스트 PBO 버퍼에 매핑합니다.
glMapBuffer(target_, GL_READ_ONLY);
그러나이 문제는 데이터를 전송하는 동안 렌더링 스레드를 차단한다는 점에서 문제가 있습니다.
렌더링을 파이프 라이닝하여이 문제를 줄일 수는 있지만 대기 시간은 내 애플리케이션에서 큰 문제입니다.
제 질문은 map_buffer_range를 MAP_UNSYNCHRONIZED_BIT와 함께 사용할 수 있는지 여부와 다른 스레드에서 맵 작업이 완료 될 때까지 기다리거나 렌더링 스레드가 다음 프레임을 렌더링하는 동안 동일한 스레드에서 맵 작업을 지연시키는 지 여부입니다.
thread 1:
map();
render_next_frame();
thread 2:
wait_for_map
또는
thread 1:
map();
while(!is_map_ready())
do_some_rendering_for_next_frame();
은 내가 확신 해요 것은 내가지도 작업이 준비가되면, 사양은 "다른 동기화 기술은 정확한 동작을 보장하기 위해"언급 아는 방법이다.
아이디어가 있으십니까?
이 "쿼리 개체"에 관해 좀 더 설명해 주시겠습니까? 준비가되지 않았다면지도에 대한 호출을 연기하기 위해 사용할 수있는 것처럼 들립니다. – ronag
이는 [ARB_sync] (http://www.opengl.org/registry/specs/ARB/sync)를 참조합니다.txt)도 코어 3.2에 있습니다. 이렇게하면 동기화 쿼리 ("울타리")를 명령 스트림에 삽입 할 수 있습니다.이 명령 스트림은 클라이언트 또는 클라이언트 + 서버에서 대기하거나 완료 상태를 쿼리 할 수 있습니다. 동기화 쿼리가 완료되었다고 반환하면 울타리를 삽입하기 전에 발생한 모든 명령이 완료되었음을 의미합니다. 따라서 귀하의 경우 데이터가 원하는 위치에 있다는 것을 알고 버퍼를 매핑하는 것이 차단되지 않습니다. – Damon
우수하지만,이 올바르게 이해하면 glReadPixels (장치 -> 호스트 전송) 호출 후 동기화 쿼리를 직접 작성해야합니다. 쿼리가 준비되었다는 것을 알게되면 map에 대한 호출이 차단되지 않을 것입니다 (아니면 매우 짧게). – ronag