當屏幕顯示動畫加載屏幕(用OpenGL渲染)時,我想加載包括OpenGL紋理的一些網格物體。渲染時加載紋理(OpenGL)
因此,我在第二個線程中執行加載操作,這當然不起作用,因爲我無法從兩個線程訪問相同的GL上下文。
我正在使用SDL 1.2,整個事情必須是平臺獨立的,所以我不能使用wgl-stuff。
我有哪些可能性?
當屏幕顯示動畫加載屏幕(用OpenGL渲染)時,我想加載包括OpenGL紋理的一些網格物體。渲染時加載紋理(OpenGL)
因此,我在第二個線程中執行加載操作,這當然不起作用,因爲我無法從兩個線程訪問相同的GL上下文。
我正在使用SDL 1.2,整個事情必須是平臺獨立的,所以我不能使用wgl-stuff。
我有哪些可能性?
這當然不是最優雅的解決方案,但您可以用空白欄繪製加載屏幕,加載一些資源並增加欄,然後再繪製它。重複,直到你已經加載了一切。
僞:
loadgraphics(){
int progress=0;
glClear(GL_COLOR_BUFFER_BIT);
//draw you loading bar from 0 to progress
//load something
++progress;
SwapBuffers(hdc);
glClear(GL_COLOR_BUFFER_BIT);
//draw you loading bar from 0 to progress
//load something
++progress;
SwapBuffers(hdc);
glClear(GL_COLOR_BUFFER_BIT);
//draw you loading bar from 0 to progress
//load something
++progress;
SwapBuffers(hdc);
glClear(GL_COLOR_BUFFER_BIT);
//draw you loading bar from 0 to progress
//load something
++progress;
SwapBuffers(hdc);
glClear(GL_COLOR_BUFFER_BIT);
//draw you loading bar from 0 to progress
//load something
++progress;
SwapBuffers(hdc);
}
這個真沒有要走的路,但它的作品,如果你只是想快速ñ骯髒的方式。
使用像素緩衝區對象爲圖像數據創建地址空間映射(glMapBuffer
),可以從進程的所有線程訪問映射的OpenGL內存區域。使用輔助線程將圖像數據複製到此中,然後在主線程中從PBO中將glUnmapBuffer
和glTexImage
複製到此。解映射和紋理上傳都會發生異步,因此您可以在前一個圖像仍然被傳輸到快速內存時處理下一個圖像。
所有你需要的只是一種在線程之間進行通信的方式,下一步要執行的任務和完成任務的時間。
是的,您可以訪問在另一個線程上創建的資源。 你需要做的是在輔助線程上創建一個次要的opengl上下文,並使用wglShareLists共享這兩個上下文之間的數據。
當然,在主線程上使用它之前,你需要再次綁定它。
也有一個看問題「[OpenGL的:用於加載資源輔助線程(http://stackoverflow.com/questions/8116305/opengl-secondary-thread-爲加載資源)」。 –