Tôi không phải là người nói tiếng Anh bản ngữ và khi tôi đang cố gắng để có được thông qua OpenGL wiki và hướng dẫn trên www.learnopengl.com, nó không bao giờ kết thúc lên dễ hiểu bởi trực giác làm thế nào toàn bộ khái niệm hoạt động. Ai đó có thể giải thích cho tôi một cách trừu tượng hơn về cách thức hoạt động của nó? Trình tạo bóng đổ và đổ bóng là gì và chúng tôi sử dụng chúng làm gì?Các trình tạo bóng trong OpenGL là gì và chúng ta cần chúng làm gì?
Trả lời
Các OpenGL wiki đưa ra một định nghĩa tốt:
Một Shader là một chương trình do người dùng định nghĩa thiết kế để chạy trên một số giai đoạn của một bộ xử lý đồ họa.
Trong quá khứ, card đồ họa là phần không thể lập trình của silic mà thực hiện một tập hợp các thuật toán cố định: điểm/màu/đèn bước vào, và một hình ảnh 2D ra sử dụng một thuật toán nhất định (thường là cùng https://en.wikipedia.org/wiki/Phong_reflection_model) .
Nhưng điều đó quá hạn chế đối với những người lập trình muốn tạo nhiều hiệu ứng hình ảnh khác nhau.
Vì vậy, khi công nghệ nâng cao, các nhà cung cấp GPU bắt đầu cho phép một số phần của đường dẫn hiển thị được lập trình bằng các ngôn ngữ lập trình như GLSL.
Các ngôn ngữ đó sau đó được chuyển đổi thành semi-undocumented instruction sets chạy trên các "CPU" nhỏ được tích hợp sẵn trong các GPU mới hơn.
Cho đến cách đây không lâu, ngôn ngữ đổ bóng were not even Turing complete.
Thuật ngữ GPU mục đích chung (GPGPU) đề cập đến khả năng lập trình tăng lên của GPU hiện đại.
Trong mô hình OpenGL, chỉ có giai đoạn màu xanh của sơ đồ sau đây là có thể lập trình:
Bóng đổ lấy đầu vào từ giai đoạn đường ống trước đó (ví dụ: vị trí đỉnh, màu sắc và pixel được rasterized) và tùy chỉnh đầu ra sang giai đoạn tiếp theo.
Hai cái quan trọng nhất là:
- vertex:
- đầu vào: vị trí của các điểm trong không gian 3D
- đầu ra: chiếu 2D của các điểm (sử dụng 4D nhân ma trận).Xem: https://stackoverflow.com/a/36046924/895245
- fragment shader:
- đầu vào: vị trí 2D của tất cả các pixel của một tam giác + (màu của các cạnh hoặc một hình ảnh texture) + tia sét thông số
- đầu ra: màu sắc của mỗi điểm ảnh của tam giác (nếu nó không được occluded bởi một tam giác gần gũi hơn), thường suy giữa đỉnh
tên sha der không phải là rất mô tả cho các kiến trúc hiện tại: "shaders" trong GLSL cũng quản lý các vị trí đỉnh, chưa kể OpenGL 4.3 GL_COMPUTE_SHADER
, cho phép tính toán tùy ý hoàn toàn không liên quan đến hiển thị, giống như OpenCL.
TODO có thể OpenGL được triển khai hiệu quả với OpenCL một mình, tức là, làm cho tất cả các giai đoạn có thể lập trình được không? Tất nhiên, phải có một sự cân bằng hiệu suất/tính linh hoạt.
GPU đầu tiên với trình tạo bóng đã sử dụng phần cứng chuyên dụng khác nhau cho đổ bóng và phân đoạn theo chiều dọc, vì những phần này có khối lượng công việc khá khác nhau. Kiến trúc hiện tại tuy nhiên, sử dụng một loại phần cứng (về cơ bản các CPU nhỏ) cho tất cả các trình đổ bóng, giúp tiết kiệm một số phần cứng sao chép. Khái niệm này được gọi là: https://en.wikipedia.org/wiki/Unified_shader_model
Để thực sự hiểu các trình đổ bóng và tất cả những gì chúng có thể làm, bạn phải xem xét nhiều ví dụ và tìm hiểu các API. Ví dụ: https://github.com/JoeyDeVries/LearnOpenGL là một nguồn tốt.
Trong OpenGL 4 hiện đại, thậm chí chào các chương trình tam giác thế giới sử dụng các trình đổ bóng siêu đơn giản, thay vì các API cũ không được chấp nhận cũ như glBegin
và glColor
. Dưới đây là một ví dụ: https://stackoverflow.com/a/36166310/895245
Một ứng dụng cổ điển mát mẻ của một Shader không tầm thường là bóng động:
Shaders về cơ bản cung cấp cho bạn màu chính xác của đối tượng mà bạn muốn hiển thị, dựa trên một số phương trình ánh sáng. Vì vậy, nếu bạn có một quả cầu, một ánh sáng, và một máy ảnh, thì máy ảnh sẽ thấy một số bóng, một số bộ phận sáng bóng, vv, ngay cả khi hình cầu chỉ có một màu. Shaders thực hiện các phép tính phương trình ánh sáng để cung cấp cho bạn những hiệu ứng này.
Trình đổ bóng đỉnh biến đổi vị trí 3D của mỗi đỉnh trong không gian ảo (mô hình 3D của bạn) thành tọa độ 2D mà nó xuất hiện trên màn hình.
Trình đổ bóng phân đoạn về cơ bản cung cấp cho bạn màu của mỗi pixel bằng cách thực hiện tính toán ánh sáng.
- 1. Trình lấy mẫu bóng trong OpenGL là gì và có thể sử dụng những gì cho chúng?
- 2. Chúng ta gọi điều này là gì?
- 3. Mutex và semaphore Trong C# là gì? nơi chúng ta cần phải thực hiện?
- 4. Trình tự (Cơ sở dữ liệu) là gì? Khi nào chúng ta cần nó?
- 5. Nếu chúng ta không thể ràng buộc một lệnh của MouseBinding, chúng ta phải làm gì?
- 6. Tại sao chúng ta cần `Các gói đã nhập 'khi chúng ta có` Các trình cắm thêm cần thiết` trong các phụ thuộc trình cắm thêm eclipse?
- 7. Ext.namespace là gì, chúng ta nên sử dụng chúng như thế nào?
- 8. Tại sao chúng ta cần sợi
- 9. __i686.get_pc_thunk.bx là gì? Tại sao chúng ta cần cuộc gọi này?
- 10. Tại sao chúng ta cần strdup()?
- 11. Chúng ta vẫn cần AsyncEnumerator của Richter?
- 12. Tại sao trước tiên chúng ta khai báo các kiểu con là siêu kiểu của chúng trước khi chúng ta khởi tạo chúng?
- 13. là resp.Body.Close() cần thiết nếu chúng ta không đọc bất cứ điều gì từ cơ thể?
- 14. Điều gì sẽ xảy ra nếu chúng ta tạo các hàm đệ quy làm nội dòng?
- 15. Tại sao chúng ta cần các Dịch vụ Web RESTful?
- 16. lý do tại sao chúng ta cần giao diện thay vì lớp và những gì chúng ta đang đạt được từ giao diện
- 17. Tại sao chúng ta cần các nhà thầu tĩnh?
- 18. khi nào chúng ta cần mẫu Adapter?
- 19. Tại sao chúng ta cần ng-click?
- 20. Trong trình đổ bóng đỉnh OpenGL, w là gì và tại sao tôi chia nó?
- 21. Tại sao chúng ta cần funcall trong Lisp?
- 22. Tại sao chúng ta cần API web trong MVC? Hạn chế trong api an toàn trong mvc là gì?
- 23. Vai trò của libc (glibc) trong ứng dụng linux của chúng ta là gì?
- 24. Tại sao chúng ta cần giao diện trong Java?
- 25. các ràng buộc IIS là gì và mục đích của chúng là gì?
- 26. MVC: tại sao chúng ta cần "điều khiển", hoặc khi nào chúng ta nên sử dụng mẫu này?
- 27. Khi nào chúng ta nên sử dụng lớp học và khi chúng ta không nên
- 28. Tại sao chúng ta cần gì hơn HTTP GET, PUT, POST?
- 29. Các cách tải JavaScript hoặc CSS mà không cần thực thi chúng là gì?
- 30. Tại sao chúng ta không thể tạo đối tượng ostream của chúng ta
Vì vậy, mỗi đối tượng mà chúng ta sẽ vẽ trên màn hình sẽ trải qua cái gọi là "Đường ống dựng hình" bao gồm đầu tiên của đỉnh và sau đó đổ bóng đổ vỡ với tính toán tạo nên hình ảnh tổng thể. Tôi có đúng không? – Tommz
Có, trình đổ bóng đỉnh hoạt động trước và trình đổ bóng phân đoạn hoạt động sau. Đường dẫn hiển thị có một số bước khác, như cắt, rasterizing, vv: http://www.opengl.org/wiki/Rendering_Pipeline_Overview – jh314
Pixel Shader là gì? Nó có đồng nghĩa với Vertex Shader không? – anonymous