2013-01-10 34 views
6

Tôi có nhiệm vụ triển khai trình hiển thị OpenGL ngoài màn hình cho cả Window và Linux trong C++. Tôi có phiên bản như vậy đã được viết bằng Java sử dụng LWJGL lib.There Tôi đã sử dụng đối tượng PBuffer, bên dưới mui xe tạo ra Pbuffers dựa trên hệ điều hành được sử dụng.Trước tiên tôi nghĩ để tái triển khai đầy đủ logic PBuffer tạo ra giống như nó tôi thực hiện trong nguồn gốc của LWJGL.Then tôi đọc this đăng trên StackOverflow.com nơi nó được đề xuất bằng cách sử dụng tạo bối cảnh chuẩn, giả sử sử dụng GLFW (đó là nền tảng chéo) nhưng không phải để tạo cửa sổ thực tế.Đó là đúng cách để đi? Ưu điểm và nhược điểm là gì khi sử dụng Pbuffer trong trường hợp này?Tạo bối cảnh tắt OpenGL nền tảng chéo

Cập nhật: Tôi chỉ muốn nhấn mạnh rằng tôi sử dụng FBOs để render các khung để vấn đề của tôi ở đây không phải là làm thế nào để render trong offscreen chế độ nhưng làm thế nào để tạo ra một bối cảnh không có cửa sổ ở cả Windows và Linux OS.

Trả lời

5

Tôi khuyên bạn không nên sử dụng PBuffers nữa mà thay vào đó hãy sử dụng Frame Buffer Objects (FBOs). FBO cung cấp hiệu suất tốt hơn nhiều khi sử dụng chúng không yêu cầu chuyển đổi ngữ cảnh và chúng có several other advantages.

LWJGL supports FBOs, nhưng GLFW là "chỉ" để thiết lập nền tảng chéo của OpenGL và not for rendering. Để sử dụng FBO đa nền tảng thuận tiện, tôi khuyên bạn nên sử dụng thư viện như OGLplus trên đầu trang của GLFW. Xem here cho ví dụ hiển thị kết cấu.

+0

Điều đó đúng, tôi giả sử sử dụng FBO. Nhưng các FBO không tạo ra ngữ cảnh GL, đó là lý do tại sao tôi hỏi câu hỏi này. –

+0

Nếu bạn muốn tăng tốc phần cứng, ít nhất là trên Windows, bạn không thể tạo ngữ cảnh OpenGL mà không tạo cửa sổ ẩn (ẩn) trước. Đó là vì [wglCreateContext] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd374379 (v = vs.85) .aspx) mong đợi một bối cảnh thiết bị (DC), và chỉ một DC của cửa sổ có thể có định dạng pixel tăng tốc phần cứng được chỉ định. Đặc biệt, bạn [không thể kết xuất với OpenGL tăng tốc phần cứng vào bộ nhớ DC] (http://www.opengl.org/discussion_boards/showthread.php/161374-Why-can-ti-write-to-a-memory-device -context? p = 1143832 & viewfull = 1 # post1143832). – sschuberth

+0

Vì vậy, bạn có nghĩa là phiên bản Windows của PBuffer trong LWJGL tạo ra cửa sổ anyway và sau đó loại bỏ nó? –

0

Theo như tôi biết không có cách đa nền tảng để tạo ngữ cảnh, bạn sẽ phải tạo trừu tượng của riêng mình và sau đó triển khai nó cho từng nền tảng.

Trên cửa sổ tôi đã sử dụng đoạn mã sau để tạo ra một bối cảnh thứ hai để làm tải của nội dung trong một thread nền (chương trình này sử dụng GLFW nhưng đó không phải vấn đề):

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

Tôi chủ yếu quan tâm đến thiết lập Linux trong trường hợp này. –

2

The Simple Directmedia lớp (SDL) là một thư viện đáng để thử. Nó đơn giản hóa việc tạo bối cảnh OpenGL nền tảng chéo, với khả năng sử dụng các bề mặt bộ nhớ để hiển thị ngoài màn hình.

Điều duy nhất bạn sẽ phải làm thêm, là bao gồm tiêu đề OpenGL và SDL từ các vị trí khác nhau, tùy thuộc vào nền tảng của bạn. Điều này có thể được thực hiện với các chỉ thị tiền xử lý đơn giản.

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