작업자 컨텍스트와 렌더 컨텍스트라는 두 가지 컨텍스트가 있습니다. 설정하는 동안 작업자 스레드가 셰이더와 VBO를 만들고 설정합니다. 그런 다음 렌더 스레드는 VBO를 사용하여 VAO를 만들고 그립니다. 화면 (또는 오래된 버텍스, 아래 참조)에는 아무 것도 표시되지 않습니다.공유 컨텍스트에서 이상한 openGL 동작, 셰이더 공유, VBO 문제 발생
VAO를 만들기 전에 렌더링 스레드가 VBO를 만들도록 허용하면 모든 것이 제대로 작동하며 작업자 스레드에서 만든 셰이더 프로그램으로 렌더링 된 삼각형이 보입니다.
정말 이상한 부분은 작동 후, 작업자 스레드의 VBO 작성으로 다시 전환하면 여전히 삼각형이 표시되지만 삼각형의 형상을 변경하면 다시 전환 할 때까지 업데이트되지 않습니다. 렌더링 스레드에서의 VBO 생성.
이것은 매우 이상합니다. 렌더링 컨텍스트가 작업자 컨텍스트에서 생성 된 셰이더를 사용하는 두 가지 방법이지만 VBO를 공유 할 수없는 것처럼 보이지만 작업자 컨텍스트에서 VBO를 만들면 꼭지점이 업데이트되지 않고 이전 프로그램 실행의 삼각형이 그립니다.
나는 우분투 16에 있습니다. 이것은 glbinding과 glbinding 그리고 최신의 glfw3와 우분투 패키지로 컴파일되었습니다.
요약하면 VBO 작성 및 드로잉은 기본 스레드에서 작업자 스레드에서 생성 된 셰이더로 작동합니다. 작업자 스레드 (동일한 함수)와 VBO를 만들려고하면 렌더링 스레드에서 사용될 때 이전 데이터가있는 새로운 버퍼에 액세스하는 것처럼 보입니다 ...
혼자하는 일에 대한 설명은 문제를 진단하기에 충분하지 않습니다. –
@NicolBolas 지식이있는 사람들에게는 완벽하게 충분했습니다. 나는 진짜 구루와 5 분 만에 대답을 얻었다. 설명은 완벽합니다. – RobC
"* 설명은 완벽합니다. *"그러나 설명은 당신이 * 다른 스레드의 버퍼를 바인딩하지 않는다고 말하지 않았습니다. 당신의 설명에서, 나는 문제가 무엇인지에 관해 추측해야만 할 것이다. 그래서 아니오, 귀하의 설명은 "완벽하지 않습니다"; 귀하의 * 소스 코드 *는 결함을 쉽게 보여주었습니다. –