Có thể hiển thị hoãn / đổ bóng với OpenGL ES 2.0 không?


20

Tôi đã hỏi điều này trên StackOverflow , nhưng nó có thể có ý nghĩa hơn ở đây:

Có ai đã triển khai kết xuất / tô bóng bị trì hoãn trong OpenGL ES 2.0 chưa? Nó không hỗ trợ các tàu điện ngầm, vì vậy chỉ với một bộ đệm màu, đó không phải là thứ có thể được thực hiện theo cách "thông thường".

Cụ thể, tôi đang khám phá trên iPad, iPhone4 (maaaybe iPhone 3gs) và Android. Trên ứng dụng GLESView trên iPad / iPhone4 / iPhone3ss, tiện ích mở rộng GL_OES_RGB8_RGBA8 đã xuất hiện và tôi chưa nhìn quá sâu, nhưng với 8 bit / kênh, ý tưởng này rất thú vị: http://www.gamedev.net/topic/ 562138-opengl-es-20-và-hoãn-shading /

Còn ý tưởng nào khác không? Nó thậm chí còn đáng làm, hiệu suất khôn ngoan?


Vâng nó có thể.
Quazi Irfan

7
Thông qua kỹ thuật nào?
Jim Buck

Câu trả lời:


15

Vâng, nó là có thể. Tuy nhiên, nó không đặc biệt đáng giá.

Đầu tiên, trừ khi bạn có quyền truy cập vào tiện ích mở rộng NV_draw_buffers (như tên gọi của nó, nó chỉ dành cho NVIDIA. Vì vậy, trừ khi bạn đang chạy trên Tegra, bạn không có nó), các đối tượng bộ đệm khung trong ES 2.0 chỉ có thể hiển thị thành một hình ảnh tại một thời điểm. Vì vậy, để tạo bộ đệm G của bạn, bạn sẽ cần kết xuất cảnh của mình nhiều lần, do đó lấy đi một trong những lợi thế của kết xuất hoãn lại.

Thứ hai, băng thông trên nền tảng di động không giống như bạn nhận được ngay cả trên các GPU cấp trung. Và băng thông là rất quan trọng để làm cho kết xuất hoãn lại (cho nhiều đèn) đáng giá. Không có băng thông đó, ánh sáng sẽ thực sự gây tổn hại, hiệu quả.

Thứ ba, phần cứng PowerVR thực sự không được thiết kế cho loại điều này. Nó tối ưu hóa kết xuất với phần cứng kết xuất dựa trên gạch. Vì vậy, kết xuất hoãn lại trên đó sẽ ít hữu ích hơn trong kiến ​​trúc chuyển đổi quét truyền thống.


6

Vấn đề chính là Fillrate. Trên GPU di động, tỷ lệ lấp đầy của bạn thấp đến mức bạn không thể thực hiện chuyển bóng trong thời gian thực ở độ phân giải gốc.

Trên iPhone 4 & iPad 1, việc điền vào chỉ là vô lý. Thiết bị iOS duy nhất có khả năng điền tốt là iPad 2, nhưng tôi nghi ngờ là có đủ ... Trên Android, chỉ có các thiết bị Tegra có GL_NV_draw_buffers để sử dụng MRT nhưng tỷ lệ lấp đầy cũng rất thấp. Mali 400 dường như có chất làm đầy tốt nhất. Nếu bạn muốn khóc, chỉ cần cố gắng lấp đầy một hình chữ nhật màu ở độ phân giải toàn màn hình 4 lần ... Nhiều thiết bị không thể thực hiện được 60 khung hình / giây.

Trên GPU máy tính để bàn, bạn có 10 lần (hoặc nhiều hơn) điền vào dưới dạng gpus di động. Đừng quên rằng GPU di động sử dụng cùng bộ nhớ với CPU và bạn không có bộ nhớ chuyên dụng.

Có một số ví dụ trong WebGL (cùng API) vì vậy đó không phải là giới hạn của API.


1
+1 để lấp đầy điểm yếu. Tôi thậm chí không thể làm mờ Gaussian để chạy ở độ phân giải 1536x2048 ở tốc độ 60fps (nó ngay lập tức giảm tốc độ khung hình xuống 30 khung hình / giây, thậm chí chỉ với 4 mẫu)
bobobobo

1
Tôi nghĩ rằng điều này phụ thuộc rất nhiều vào sự tinh tế trong quá trình thực hiện của bạn và hiểu được điều gì tác động nhiều nhất đến phần cứng di động. Ví dụ, những kẻ này đã làm một DoF hoạt động vừa phải làm mờ trở lại vào năm 2012.
Kỹ sư

1

Thực sự bạn phải xem xét mức tối thiểu tuyệt đối bạn cần cho một trình kết xuất bị trì hoãn là bao nhiêu. Nếu bạn quay lại với ánh sáng bị trì hoãn, nó sẽ giảm lượng dữ liệu cần lưu trữ trong GBuffer và thực sự nó rẻ hơn rất nhiều so với hiển thị một nửa cảnh 3 lần trở lên để hỗ trợ lượng ánh sáng thấp.

Tôi sẽ sử dụng định dạng GBuffer sau:

  • Sử dụng lại bộ đệm độ sâu cho đường truyền ánh sáng, không chắc mức độ này được hỗ trợ rộng rãi như thế nào trên thiết bị di động, nhưng đó là kết cấu độ sâu miễn phí.
  • Một kết cấu GBuffer duy nhất, bên trong nó tôi sẽ lưu trữ: Bình thường U, Bình thường V, Thông số 0, Tham số 1. Mã hóa Lambert-Azimuthal trông rất đẹp đối với các quy tắc và nén chúng thành hai thành phần, tương đối rẻ để mã hóa và giải mã.
  • Hai tham số cho các biến ánh sáng là rất nhiều, có thể sử dụng một tham số cho nhiều chức năng chiếu sáng nếu phần cứng hoạt động tốt với phân nhánh động.

Ánh sáng hoãn lại tương tự như kết xuất hoãn lại, ngoại trừ bạn kết xuất cảnh hai lần:

  1. Kết xuất các thông số hình học độ sâu, chỉ tiêu và ánh sáng vào GBuffer.
  2. Kết xuất đèn vào bộ đệm tích lũy.
  3. Kết xuất hình học với các shader vật liệu, kết hợp ánh sáng của bạn ở đây là tốt. Nếu bạn giỏi với việc vận hành ngược các phương trình chiếu sáng, bạn có thể thực hiện RẤT NHIỀU điều thực sự thú vị với bước này.
  4. Thực hiện bất kỳ xử lý hậu kỳ nào bạn có thể đủ khả năng, hãy chắc chắn lạm dụng độ sâu và kết cấu bình thường cho đến chết ở đây vì lợi ích hiệu quả.

Về lưu trữ kết quả chiếu sáng. Tôi đã thích lưu trữ màu sắc khuếch tán và độ chói đặc trưng để bộ đệm tích lũy chỉ cần là một kết cấu màu 32 bit tiêu chuẩn. Bạn có thể ước tính màu sắc đặc trưng bằng cách tính màu sắc của màu khuếch tán và kết hợp màu sắc với độ chói của gương.

Tuy nhiên, phần quan trọng nhất sẽ là sử dụng bộ đệm st sâu để nó đầy đủ nhất, đảm bảo rằng bạn không hiển thị bất kỳ mã ánh sáng nào khi không cần thiết. Tôi thậm chí còn đi xa hơn để thêm một số câu lệnh loại bỏ vào các shader mảnh theo các điều khoản sẽ làm giảm khả năng hiển thị dưới mức hiển thị của thiết bị (1e-3 thường là mức cắt an toàn).


discardthực sự rất tệ cho các đường ống dựa trên gạch mà nhiều / hầu hết các GPU di động sử dụng.
Kỹ sư

1

Hãy xem xét ánh sáng hoãn lại. Tóm lại, chiếu sáng hoãn lại là một kỹ thuật sử dụng một phiên bản thu nhỏ của bóng mờ bị trì hoãn để tính toán ánh sáng không gian màn hình. Trong lần truyền thứ hai, hình học được hiển thị lại bằng cách sử dụng ánh sáng không gian màn hình làm thông tin chiếu sáng.

Kỹ thuật này được sử dụng để giảm kích thước của Bộ đệm G, vì cần ít thuộc tính hơn. Nó cũng mua cho bạn một lợi thế, đó là G-Buffer và ánh sáng không gian màn hình có thể có độ phân giải thấp hơn màn hình.

Tôi đã triển khai trình kết xuất dựa trên GLES 2.0 nghiêm ngặt (mặc dù là trình thử nghiệm) và tôi đã quản lý để chuyển G-Buffer xuống một kết cấu RGBA (vâng, tôi đã sử dụng texture2D thay vì trình kết xuất đồ họa). Nó chứa không gian màn hình bản đồ bình thường + bộ đệm độ sâu trong kênh alpha (được nén bằng logarit, theo như tôi nhớ).

Các thuộc tính vị trí (được gọi là thế giới ở đây) có thể được tính toán trong quá trình chiếu sáng bằng cách sử dụng thực tế, rằng trong một phép chiếu phối cảnh, .xy bị lệch bởi .z , do đó:

xyfrbạnStbạnm= =xywortôid/zwortôid

Tôi đã xấp xỉ xy của thuộc tính vị trí bằng cách thực hiện:

xywortôid= =xyfrbạnStbạnm*zwortôid

Lưu ý: Tôi phải điều chỉnh thêm tùy theo cài đặt của ma trận chiếu.

Cũng đáng chú ý là, rằng tôi có khả năng để bỏ qua z thành phần của vectơ bình thường, kể từ khi tôi có thể tái tạo lại z từ .xy kể từ vector bình thường được chuẩn hóa để:

x2+y2+z2= =1x2+y2+z2= =1z2= =1-(x2+y2)z= =1-(x2+y2)

Sử dụng kỹ thuật này, tôi có khả năng giải phóng một kênh khác trong Bộ đệm G RGBA của mình và sử dụng kênh này để lưu trữ bản đồ không gian màn hình (hoặc độ bóng, nếu bạn muốn).


BTW: Trình kết xuất của tôi không được gắn vào bất kỳ công cụ trò chơi nào. Đó là một bản demo thế giới xin chào, thể hiện Suzanne.
Simon Schmidt

0

Vâng, nó là hoàn toàn có thể. Tỷ lệ lấp đầy không phải là một vấn đề như vậy bởi vì chip đồ họa di động được thiết kế để đối phó với màn hình độ phân giải rất cao. Trên thực tế, kết xuất hoãn lại giúp ích cho việc này vì tính toán ánh sáng của bạn không phụ thuộc vào độ phức tạp của cảnh, do đó, quá mức không gây ra sự chậm lại. Đây là cách triển khai của tôi trên iPad thế hệ thứ tư: http://www.youtube.com/watch?v=K4X1oF6b4V8

Nếu bạn muốn hiệu suất gấp bốn lần, chỉ cần một nửa độ phân giải của kết cấu bạn kết xuất. Dù sao, tôi thực sự không thể thấy bất kỳ sự khác biệt nào với đồ họa 3D trên màn hình võng mạc.

Chip đồ họa di động cực kỳ tốt trong việc kết xuất hoãn lại vì cách chúng xử lý kết xuất đồ họa. Không giống như các card đồ họa PC, thường có hiệu năng rất lớn khi bạn bắt đầu kết xuất thành một kết cấu thay vì bối cảnh cửa sổ, đồ họa di động được thiết kế để làm điều này mà không có hiệu năng. Vì vậy, bạn có được khả năng mở rộng của trình kết xuất bị trì hoãn mà không bị phạt hiệu năng ban đầu mà bạn gặp phải trên thẻ đồ họa trên máy tính để bàn.

Tại thời điểm triển khai, OpenGLES bị thiếu kết xuất cho nhiều mục tiêu, vì vậy tôi phải vẽ màu màn hình và bình thường trong các lượt riêng biệt. Điều này có thể được sửa trong các phiên bản OpenGLES gần đây, nhưng không biết các giải pháp đã có sẵn trong phần cứng di động của người tiêu dùng chưa.


3
"Chip đồ họa di động cực kỳ tốt trong việc kết xuất chậm vì cách chúng xử lý kết xuất đồ họa. Không giống như card đồ họa PC, thường gây ra hiệu ứng lớn khi bạn bắt đầu kết xuất thành kết cấu thay vì bối cảnh cửa sổ, đồ họa di động là được thiết kế để làm điều này mà không có hiệu suất. " Đó là một khẳng định rất lớn trong đó. Bạn có bất kỳ tài liệu tham khảo có uy tín để ủng hộ yêu cầu này?
Panda Pyjama
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.