Nội dung của bộ đệm * sau * một cuộc gọi đến glSwapBuffers () là gì?


8

( SDL_GL_SwapBuffers()đặc biệt)

Khi bạn đã vẽ một cảnh, và bạn gọi bộ đệm trao đổi, đó là thói quen trước đó glClear()là cảnh trước khi vẽ bất cứ thứ gì; Nếu bạn không rõ, nội dung của bộ đệm là gì? Điều này được xác định bởi bất kỳ đặc điểm kỹ thuật, hoặc nó thay đổi theo trình điều khiển?


Đây là câu hỏi rất thú vị.
Notabene

Câu trả lời:


13

Các chi tiết về cách hoán đổi bộ đệm trước và sau khác nhau tùy theo từng nền tảng và vì vậy câu trả lời phụ thuộc vào nền tảng.

Theo tài liệu tham khảo GLX glXSwapBuffers :

Nội dung của bộ đệm trở lại không xác định sau khi trao đổi. Lưu ý rằng điều này áp dụng cho bộ đệm pixel cũng như các cửa sổ.

Tuy nhiên, có tồn tại tiện ích mở rộng GLX_EXT_buffer_age :

Mục đích của tiện ích mở rộng này là để hiển thị đủ thông tin cho các ứng dụng về cách trình điều khiển quản lý bộ đệm trước và sau được liên kết với một bề mặt nhất định để cho phép các ứng dụng sử dụng lại nội dung của các khung cũ và giảm thiểu mức độ phải vẽ lại cho Khung tiếp theo.

Nhưng Win32 SwapBuffers chỉ nói:

Nếu định dạng pixel hiện tại cho cửa sổ được tham chiếu bởi ngữ cảnh thiết bị này bao gồm bộ đệm phía sau, chức năng trao đổi bộ đệm trước và sau ... Nếu định dạng pixel hiện tại cho cửa sổ được tham chiếu bởi ngữ cảnh thiết bị không bao gồm bộ đệm phía sau, thì điều này cuộc gọi không có hiệu lực và nội dung của bộ đệm trở lại không được xác định khi hàm trả về.

CGLFlushDrawable, cho OS X Core Graphics cho biết:

Nếu thuộc tính cửa hàng sao lưu được đặt thành false, bộ đệm có thể được trao đổi thay vì sao chép. Đây thường là trường hợp ở chế độ toàn màn hình. Nếu người nhận không phải là một bối cảnh đệm đôi, cuộc gọi này không làm gì cả.

Cuối cùng, trong chức năng hoán đổi bộ đệm tiêu chuẩn OpenGL ES eglSwapBuffers :

Bộ đệm màu của bề mặt không được xác định sau khi gọi eglSwapBuffers.

Vậy, tất cả điều này có ý nghĩa gì?

  • Để thực sự đa nền tảng, bạn không thể thừa nhận bất cứ điều gì về bộ đệm phía sau sau khi trao đổi. Nội dung của nó không được xác định và có lẽ bạn nên glClear hoặc sửa chữa nó trước khi sử dụng nó.
  • Nếu bạn đang sử dụng Linux, bạn có thể kiểm tra phần mở rộng tuổi đệm. Bởi vì một hệ thống có thể được đệm ba lần, bạn có thể phải theo dõi nhiều khung hình có giá trị thiệt hại và đối phó với điều đó.
  • Nếu bạn đang sử dụng OS X, bạn có thể bị sao chép và bạn có thể nhận được một trao đổi. Vì vậy, bạn có thể giả định rằng nội dung của backbuffer không phải là rác, nhưng bạn không kiểm soát được đó là khung bạn vừa gửi hay khung trước đó.
  • Nếu bạn chỉ nhắm mục tiêu Win32 và chắc chắn rằng bạn có bộ đệm phía sau, có lẽ bạn có thể cho rằng nội dung của nó bây giờ là những gì trong bộ đệm phía trước. (Mặc dù đây là một giả định từ thiếu sót thay vì được nêu rõ ràng; tôi sẽ không ngạc nhiên nếu nó không hoạt động trên nhiều / bất kỳ cấu hình nào.)

Đưa ra các ràng buộc của GLX và CGL và mong muốn giảm thiểu các thay đổi giữa OpenGL và OpenGL ES, bạn cũng có thể cho rằng nội dung là rác.


1

Từ những gì tôi đã đọc hành vi duy nhất là HIỂU. Vì vậy, tôi sẽ cho rằng không có gì đảm bảo cho nội dung của bộ đệm. Chưa kể rằng một số lib thực sự bao gồm một cuộc gọi rõ ràng vào cuộc gọi bộ đệm trao đổi.


-1 vì thiếu nguồn cung ứng; Tài liệu OpenGL rất phong phú và dễ dàng liên kết.

+1 bởi vì, tốt, anh ấy thực sự đã trả lời và câu trả lời là chính xác. Nguồn chắc chắn giúp đỡ, nhưng không có nghĩa là cần thiết!
o0 '.

@ Lo'oris: Ngoại trừ, tốt, anh ấy không đúng. Anh ấy đúng cho một số nền tảng, nhưng không phải tất cả, như câu trả lời của tôi giải thích.

@Joe: Câu trả lời duy nhất đúng bất kể "môi trường" là câu trả lời này, như câu trả lời của bạn giải thích. Mã hóa biết điều này sẽ phá vỡ "một nơi nào đó" sẽ là sai ngay từ đầu.
o0 '.

1
@ Lo'oris: Tất cả mã, đặc biệt là mã kết xuất, có khả năng bị hỏng ở đâu đó . Một câu trả lời tốt không chỉ nói như vậy, mà giải thích nơi đó ở đâu đó.

0

Hành vi bị HIỂU, vì vậy nếu bạn sẽ lấp đầy toàn bộ màn hình, bạn có thể xem xét giảm độ sáng .. ngoại trừ, trên một số môi trường (ít nhất là các kiến ​​trúc ốp lát), điều đó thực sự sẽ làm giảm hiệu suất. Toàn màn hình rõ ràng khi bắt đầu kết xuất là hoạt động phổ biến đến mức tôi sẽ ngạc nhiên nếu nó không được tối ưu hóa tốt trên tất cả các nền tảng đích.

Lý do tại sao nó HIỂU R isNG là đối với nhiều kiến ​​trúc, làm cho trạng thái nội dung được xác định sẽ là một chi phí phụ, bất kể bạn định nghĩa tiêu chuẩn như thế nào.

Theo những gì bạn sẽ tìm thấy ở đó, tôi có thể đoán dựa trên kinh nghiệm;

Trên các kiến ​​trúc đệm đôi (hoặc đa), giống như hầu hết các phần cứng video trên máy tính để bàn, bạn có thể sẽ tìm thấy dữ liệu bộ đệm "khác". Mặc dù vậy, điều này không được đảm bảo, vì nó không nằm trong thông số kỹ thuật, nếu một số lợi ích tối ưu hóa kỳ lạ từ nó, họ sẽ cắt xén dữ liệu.

Trên các kiến ​​trúc lát gạch, bạn có thể tìm thấy cùng một dữ liệu như khung cuối cùng, một số dữ liệu bị cắt xén kỳ lạ dựa trên kích thước ô hoặc bất kỳ thứ gì khác.

Sau đó, bạn có một số kiến ​​trúc lẻ bóng (như NDS) có thể cung cấp cho bạn bất cứ thứ gì, vì định nghĩa của bộ đệm không chính xác như bạn mong đợi.


Wow, phiếu bầu tiêu cực. Tôi nghiêm túc về những gì tôi đã viết về mặc dù - đặc biệt là nếu bạn đang viết cho phần cứng di động, hãy chắc chắn bao gồm rõ ràng ở đó.
Jari Komppa

Tôi đánh giá thấp vì câu trả lời của bạn gần giống với câu trả lời của David, vẫn không có tài liệu tham khảo, và giống như của David, không đúng cũng như toàn bộ câu chuyện.

Đồng ý. Tuy nhiên, tài liệu tham khảo duy nhất tôi có thể đưa ra là kinh nghiệm của riêng tôi. Tôi sẽ cẩn thận hơn.
Jari Komppa

Tôi đã từ chối vì câu trả lời này hoàn toàn tệ nhất sau đó là hai câu hỏi khác (mà cả hai tôi đều nêu lên): nó không thêm gì và không rõ ràng lắm.
o0 '.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.