簡體   English   中英

創建跨平台OpenGL屏幕外上下文

[英]Creating cross platform OpenGL off-screen context

我有一個任務是在C ++中為Window和Linux實現屏幕外OpenGL渲染器。我已經使用LWJGL lib用Java編寫了這樣的版本。我使用了PBuffer對象,它根據使用的OS創建了Pbuffers。首先我想到的重新實現完整的PBuffer創建邏輯就像我在LWJGL的原生源中完成一樣。然后我在StackOverflow.com上閱讀這篇文章,建議使用標准上下文創建,讓我們說使用GLFW (這是跨平台)但是不要創建實際的窗口。這是正確的方法嗎? 在這種情況下使用Pbuffer的利弊是什么?

更新:我只想強調我使用FBO渲染幀,所以我的問題不在於如何在屏幕外模式下渲染,而是如何在Windows和Linux操作系統中創建沒有窗口的上下文。

我強烈建議不再使用PBuffers ,而是使用幀緩沖對象(FBO) FBO提供了更好的性能,因為使用它們不需要上下文切換,並且它們還具有其他幾個優點

LWJGL支持FBO ,但GLFW “僅僅”用於OpenGL的跨平台設置而不是用於渲染 為方便跨平台的FBO使用,我建議在GLFW之上使用像OGLplus這樣的庫。 請參閱此處獲取渲染到紋理的示例。

Simple DirectMedia Layer(SDL)庫值得一試。 它簡化了跨平台OpenGL上下文創建,並能夠使用內存表面進行屏幕外渲染。

您唯一需要做的就是根據您的平台包含來自不同位置的OpenGL和SDL標頭。 這可以通過簡單的預處理器指令來完成。

據我所知,沒有跨平台的創建上下文的方法,你必須創建自己的抽象,然后為每個平台實現它。

在Windows上我使用以下代碼創建第二個上下文來在后台線程中加載內容(這個程序使用了GLFW,但這無關緊要):

void Program::someFunction()
{
    HDC hdc = wglGetCurrentDC();
    HGLRC hglrc = wglGetCurrentContext();
    HGLRC hglrc_new = wglCreateContext(hdc);
    wglShareLists(hglrc, hglrc_new);
    loadThread = boost::thread(&Program::loadFunc, this, hdc, hglrc_new);
}

/**
 * Imports all our assets. Supposed to run in its own thread with its own OpenGL context.
 * @param hdc The current device context.
 * @param hglrc A OpenGL context thats shares its display list with the main rendering context.
 */
void Program::loadFunc(HDC hdc, HGLRC hglrc)
{   
    wglMakeCurrent(hdc, hglrc);

        //Do stuff...

    wglMakeCurrent(NULL, NULL);
    wglDeleteContext(hglrc);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM