2013-07-22 1 views
8

私は、メインスレッドがオブジェクトをレンダリングし続けることができるように、別のスレッド上のOpenGLリソース読み込みのやや圧倒的な場面に入り始めました。ステップインすると、GLFWがコンテキスト管理が容易になり、月に1回更新されたバージョンをリリースしたことに気付きました。GLFW 3.0 OpenGLによるリソース読み込み

しかし、glfwMakeContextCurrent()では、これを可能にすることができませんでした。読み込み中のスレッドでは、この関数を使用し、完了後に再び追加して、メインスレッドがその後の使用のためにコンテキストを受け取るようにします。これは、シェイダーやその他のOpenGL関連の作成を作成してコンパイルすることはできません。

更新日:

私はこのような状況でGLFWを使用できるように行われる必要がありますか? GLFWはポータブルなので、私はそれを含むコードを使用したいと思います。私は、GLFW APIを念頭に置いてスレッドを準備するために必要な手順を知らない。

this私は、OpenGLコンテキスト(同じコンテキストではなく、D)を持つ2つのスレッドを作成し、情報を共有する必要があります。ただし、表示される説明はプラットフォーム固有のものです。 GLFWをどのように使用すれば、この例の手順はプラットフォームに依存しないようにできるのでしょうか?

+1

すべてではない明確なあなたが求めているもの。それを具体的な例に絞り込めますか? – DarenW

+2

2つの別々のスレッドで同じコンテキストを最新にすることはできません。 –

+0

うまくいけば私はすべての懸念に対処しました。 – Behemyth

答えて

16

glfwCreateWindow()shareパラメータを使用します。

#include <GL/glew.h> 
#include <GLFW/glfw3.h> 
#include <chrono> 
#include <thread> 
#include <atomic> 

// reload shared VBO with random data every second 
void MyThread(GLFWwindow* win, GLuint vbo, std::atomic<bool>& running) 
{ 
    glfwMakeContextCurrent(win); 
    glewInit(); 
    while(running) 
    { 
     float temp[ 512 ]; 
     for(size_t i = 0; i < 512; i+=2) 
     { 
      temp[ i+0 ] = static_cast<float>(rand() % 600); 
      temp[ i+1 ] = static_cast<float>(rand() % 600); 
     } 

     glBindBuffer(GL_ARRAY_BUFFER, vbo); 
     glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 512, temp, GL_DYNAMIC_DRAW); 
     glBindBuffer(GL_ARRAY_BUFFER, 0); 

     // oddly important, might need to be glFinish() 
     glFlush(); 

     std::this_thread::sleep_for(std::chrono::milliseconds(1000)); 
    } 
} 

int main(int argc, char** argv) 
{ 
    if(!glfwInit()) 
     return -1; 

    glfwWindowHint(GLFW_VISIBLE, GL_FALSE); 
    GLFWwindow* threadWin = glfwCreateWindow(1, 1, "Thread Window", NULL, NULL); 

    glfwWindowHint(GLFW_VISIBLE, GL_TRUE); 
    GLFWwindow* window = glfwCreateWindow(600, 600, "Hello World", NULL, threadWin); 
    glfwMakeContextCurrent(window); 
    glewInit(); 

    // load shared VBO with dummy data 
    float temp[ 512 ] = { 0 }; 
    GLuint vbo; 
    glGenBuffers(1, &vbo); 
    glBindBuffer(GL_ARRAY_BUFFER, vbo); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 512, temp, GL_DYNAMIC_DRAW); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 
    std::atomic<bool> running(true); 
    std::thread aThread(MyThread, threadWin, vbo, std::ref(running)); 

    while(!glfwWindowShouldClose(window)) 
    { 
     glfwPollEvents(); 

     glClear(GL_COLOR_BUFFER_BIT); 

     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 
     glOrtho(0, 600, 0, 600, -1, 1); 
     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 

     glEnableClientState(GL_VERTEX_ARRAY); 
     glBindBuffer(GL_ARRAY_BUFFER, vbo); 
     glVertexPointer(2, GL_FLOAT, 0, 0); 
     glColor3ub(255, 0, 0); 
     glDrawArrays(GL_LINES, 0, 256); 
     glBindBuffer(GL_ARRAY_BUFFER, 0); 
     glDisableClientState(GL_VERTEX_ARRAY); 

     std::this_thread::sleep_for(std::chrono::milliseconds(10)); 
     glfwSwapBuffers(window); 
    } 

    running = false; 
    aThread.join(); 

    glfwTerminate(); 
    return 0; 
} 
+1

ありがとうございました! – Behemyth

関連する問題