2013-07-22 27 views
8

Tôi đã bắt đầu tham gia vào cảnh hơi tải quá tải của tài nguyên OpenGL trên một chuỗi riêng biệt để chủ đề chính có thể tiếp tục hiển thị một đối tượng. Khi bước vào, tôi nhận thấy rằng GLFW đã phát hành một phiên bản cập nhật một tháng trở lại với quản lý ngữ cảnh dễ dàng hơn.GLFW 3.0 Tải tài nguyên Với OpenGL

Tuy nhiên, với glfwMakeContextCurrent() Tôi đã không thể thực hiện điều này có thể. Trong chuỗi tải tôi sử dụng chức năng này và sau khi hoàn thành, tôi thêm nó một lần nữa để chủ đề chính sau đó nhận được bối cảnh để sử dụng thêm. Điều này không cho phép tôi tạo và biên dịch bóng đổ hay bất kỳ sự sáng tạo liên quan đến OpenGL nào khác.

CẬP NHẬT:

Cần phải làm gì để tôi có thể sử dụng GLFW trong tình huống này? Như GLFW là di động, tôi rất thích sử dụng mã bao gồm nó. Tôi không biết các bước cần thiết để chuẩn bị một thread giữ GLFW API trong tâm trí.

this trạng thái bài đăng trên blog, tôi cần phải tạo hai chủ đề có ngữ cảnh OpenGL (không phải ngữ cảnh tương tự; D) và sau đó chia sẻ thông tin. Tuy nhiên, các hướng dẫn được hiển thị là nền tảng cụ thể. Làm thế nào tôi có thể sử dụng GLFW để các bước trong ví dụ này là nền tảng độc lập nhất có thể?

+1

Không hề rõ ràng những gì bạn đang yêu cầu. Bạn có thể vứt nó xuống một ví dụ cụ thể không? – DarenW

+2

Bạn không thể tạo cùng một ngữ cảnh hiện tại trong hai chuỗi riêng biệt. –

+0

Hy vọng rằng tôi đã giải quyết tất cả các mối quan tâm. – Behemyth

Trả lời

16

Sử dụng các tham số share trên glfwCreateWindow():

#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

Cảm ơn bạn đã trả lời! – Behemyth

Các vấn đề liên quan