2011-08-15 18 views
5

Tôi muốn biết làm thế nào là đúng cách để bắt chước độ phân giải thấp của các trò chơi cũ hơn (như Atari 2600) trong OpenGL để thực hiện trò chơi fps. Tôi tưởng tượng cách tốt nhất để làm điều đó là viết bộ đệm vào một kết cấu, đặt lên một quad và hiển thị nó với độ phân giải màn hình.độ phân giải thấp trong OpenGL để bắt chước các trò chơi cũ hơn

Hãy xem các http://www.youtube.com/watch?v=_ELRv06sa-c, ví dụ (trò chơi tuyệt vời!)

Bất cứ lời khuyên, giúp đỡ hoặc mẫu mã sẽ được hoan nghênh.

+0

Điều đó có vẻ khá thú vị. Không phải là trải nghiệm đó với OpenGL, nhưng không thể đạt được hiệu ứng pixelation bằng trình đổ bóng đoạn GLSL cơ bản? Có vẻ như có một số nhiễu/hạt đơn sắc là tốt và nó có thể chỉ là nén video, nhưng có thể một chút mờ trên chuyển động nhanh. –

+0

@George Tôi không chắc chắn nếu bạn có thể làm điều đó chỉ với một shader mảnh. –

Trả lời

8

Tôi nghĩ cách tốt nhất để làm điều đó giống như bạn đã nói, kết xuất mọi thứ thành một kết cấu có độ phân giải thấp (tốt nhất là sử dụng FBOs) và sau đó chỉ hiển thị kết cấu bằng cách vẽ một quad có kích thước sceen (tất nhiên sử dụng GL_NEAREST như bộ lọc phóng đại cho kết cấu). Có lẽ bạn cũng có thể sử dụng glBlitFramebuffer để sao chép trực tiếp từ FBO có độ phân giải thấp vào bộ đệm khung hình có độ phân giải cao, mặc dù tôi không biết liệu bạn có thể sao chép trực tiếp vào bộ đệm khung mặc định (trình bày) theo cách này hay không.

EDIT: Sau khi nhìn lên các đặc điểm kỹ thuật cho framebuffer_blit có vẻ như bạn chỉ có thể sao chép từ độ phân giải thấp FBO vào framebuffer độ phân giải cao mặc định sử dụng glBlitFramebuffer(EXT/ARB). Điều này có thể nhanh hơn bằng cách sử dụng một kết cấu ánh xạ quad vì nó hoàn toàn bỏ qua các đường ống phân đoạn đỉnh-đường ống (mặc dù điều này sẽ có được một đơn giản). Và một ưu điểm nữa là bạn cũng có được độ phân giải thấp và bộ đệm stencil nếu cần thiết và cách này có thể hiển thị nội dung có độ phân giải cao trên nền có độ phân giải thấp có thể là một hiệu ứng thú vị. Vì vậy, nó sẽ xảy ra bằng cách nào đó như thế này:

generate FBO with low-res renderbuffers for color and depth (and stencil) 
... 
glBindFramebuffer(GL_FRAMEBUFFER, lowFBO); 
render_scene(); 
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); 
glBlitFramebuffer(0, 0, 640, 480, 0, 0, 1024, 768, 
    GL_COLOR_BUFFER_BIT [| GL_DEPTH_BUFFER_BIT], GL_NEAREST); 
+0

Kết quả thật sự rất hay. Bây giờ thử thách mới của tôi là trộn fbo này (làm cho độ phân giải thấp) với glsl (shader fragment để thêm shader sản xuất bài). Cảm ơn! – xbelanch

+1

Sau một năm, câu trả lời của bạn đã giúp tôi một lần nữa. Tôi đã có một vấn đề lớn trong cố gắng để sao chép một mảnh shader trong resz thấp (ha ha, có vẻ là nỗi ám ảnh của tôi!). Tôi chia sẻ với bạn video: http://www.youtube.com/watch?v=9KPgjS7QSUA – xbelanch

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