멀티 스레드 OpenGL 응용 프로그램을 사용하여 VBO를 업데이트하고 동시에 사용하는 방법은 무엇입니까? glMapBuffer첫 번째 스레드에서 VBO (두

간단한 응용 프로그램이 있습니다. 각각 자체 렌더링 컨텍스트가있는 두 개의 스레드가 있지만 하나의 VBO를 공유합니다 (작동 중입니다. 테스트했습니다).

이제 내가 원하는 것 : 한 스레드는 VBO의 전반에서 일부 데이터를 렌더링하고 두 번째 스레드는 VBO의 두 번째 부분을 업데이트합니다.

VBO를 업데이트하지 않으면 정상적으로 작동합니다.

그러나 업데이트 할 때 이상한 문제가 있습니다. glMapBuffer첫 번째 스레드에서 VBO (두 번째 스레드)를 업데이트 할 때 대부분의 경우 아무 것도 렌더링하지 않습니다 glClear. 통화 후 전체 화면이 깨끗 합니다. VBO의 데이터를 만질 수없는 것처럼 보입니다 (전체 버퍼가 매핑되어 어떻게 든 잠길 수 있기 때문에 이해할 수 있습니다).

사용 glMapBufferRange하는 을 사용하려고했습니다 GL_MAP_UNSYNCHRONIZED_BIT. “VBO를 기다리지 말고 원하는대로 사용하지 마십시오. 프로그램 (프로그램)이 직접 동기화합니다”를 의미합니다. 또한 다양한 VBO를 매핑하고 다른 부분의 데이터를 렌더링 할 때 기다리지 않아도되지만와 동일한 문제가 발생합니다 glMapBuffer.

아무도이 문제를 해결하거나 왜 그런지 설명 할 수 있습니까?



답변

누군가이 문제에 관심이 있다면 OpenGL forum에서 솔루션 찾을 수 있습니다 . 기본적으로 버퍼는 두 스레드 또는 컨텍스트에서 동시에 액세스 할 수 없으며 읽기 또는 쓰기가 아닙니다. 따라서 같은 잠금 메커니즘 std::mutex이 필요합니다.