2013-07-22 51 views
11

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

12

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:

enter image description here

Image source.

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:
  • 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

enter image description here

Image source.

Để 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ư glBeginglColor. 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:

Image source.

15

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.

+3

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

+3

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

+0

Pixel Shader là gì? Nó có đồng nghĩa với Vertex Shader không? – anonymous

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