2012-12-15 120 views
2

當屏幕顯示動畫加載屏幕(用OpenGL渲染)時,我想加載包括OpenGL紋理的一些網格物體。渲染時加載紋理(OpenGL)

因此,我在第二個線程中執行加載操作,這當然不起作用,因爲我無法從兩個線程訪問相同的GL上下文。

我正在使用SDL 1.2,整個事情必須是平臺獨立的,所以我不能使用wgl-stuff。

我有哪些可能性?

回答

1

這當然不是最優雅的解決方案,但您可以用空白欄繪製加載屏幕,加載一些資源並增加欄,然後再繪製它。重複,直到你已經加載了一切。
僞:

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); 
} 

這個真沒有要走的路,但它的作品,如果你只是想快速ñ骯髒的方式。

3

使用像素緩衝區對象爲圖像數據創建地址空間映射(glMapBuffer),可以從進程的所有線程訪問映射的OpenGL內存區域。使用輔助線程將圖像數據複製到此中,然後在主線程中從PBO中將glUnmapBufferglTexImage複製到此。解映射和紋理上傳都會發生異步,因此您可以在前一個圖像仍然被傳輸到快速內存時處理下一個圖像。

所有你需要的只是一種在線程之間進行通信的方式,下一步要執行的任務和完成任務的時間。

0

是的,您可以訪問在另一個線程上創建的資源。 你需要做的是在輔助線程上創建一個次要的opengl上下文,並使用wglShareLists共享這兩個上下文之間的數據。

當然,在主線程上使用它之前,你需要再次綁定它。

還要檢查這個問題 SDL/OpenGL: Implementing a "Loading thread"

+0

也有一個看問題「[OpenGL的:用於加載資源輔助線程(http://stackoverflow.com/questions/8116305/opengl-secondary-thread-爲加載資源)」。 –