I. Mở đầu
Bạn đã bao giờ tự hỏi tại sao các bộ phim, các trò chơi AAA chỉ là giả lập máy tính, là thế giới ảo nhưng lại chân thật đến thế chưa? Những con sóng nhấp nhô, bầu trời mây chầm chậm trôi, bóng vật thể phản chiếu dưới nước,.. đã được tạo nên như thế nào? Chính shader là một trong những yếu tố quan trọng tạo nên chúng.
Vậy shader là gì, và nó đóng vai trò như thế nào trong việc tạo ra những trải nghiệm đồ họa ấn tượng trên?
II. Shader
1. Shader là gì?
Shader là chương trình đồ họa máy tính xử lý các phép toán đồ họa như tính toán màu sắc, đổ bóng, ánh sáng, các hiệu ứng hình ảnh khác nhau trên các vật thể 2D hoặc 3D. Nó là đồng thời được thực thi cùng một lúc cho các điểm ảnh của màn hình. Do đó, shader thường sẽ được chạy trên GPU thay vì CPU.
2. Phân loại
Đây là một số loại shader phổ biến trong đồ họa máy tính:
- Vertex shader: đây là shader đầu tiên trong graphic pipline. Nó nhận thông tin đầu vào về các đỉnh trong mô hình 3D như tọa độ, màu sắc, pháp tuyền,… và xử lý chúng. Thường được dùng để tính toán vị trí đỉnh, tính toán ánh sáng, ánh xạ material, di chuyên, xoay, biến dạng vật thể trong không gian 3D…
- Geometry shader: là shader làm việc sau vertex shader, nó có thể thay đổi số đỉnh, hình dạng của mô hình 3d.
- Fragment shader: là shader chịu tránh nhiệm tính toán màu sắc các điểm ảnh trên màn hình. Thường dùng để vẽ màu cho các bề mặt, tạo hiệu ứng bóng đổ, làm mờ, phản chiếu vật thể,..
- Tessellation shader: thường được dùng để chia nhỏ các đối tượng 3D để tăng độ chi tiết cho chúng.
- Compute shader: Không phải là một phần của graphic pipline, nhưng nó được sử dụng để thực hiện các phép toán chung trên GPU. Thường được dùng để xử lý các phép toán số liệu phức tạp hoặc các phép toàn song song như hiệu ứng vật lý, mô phỏng,…
3. Graphic pipline

Tùy thuộc vào loại computer graphics (OpenGL, DirectX, Vulkan,…) mà cấu trúc sẽ khác nhau một chút nhưng nhìn chung 6 giai đoạn chính:
- Vertex processing: Nhận dữ liệu về đỉnh, áp dụng các phép toán không gian.
- Tessellation: Phân mảnh đổi tượng 3D để tạo chi tiết.
- Geometry Processing: Thêm chi tiết hình học hoặc thay đổi đối tượng.
- Rasterization: Bước nay chuyển đổi các đối tượng 3D đã được xử lý thành các pixel 2D để GPU hiển thị ra màn hình.
- Fragment Processing: các pixel sau khi rasteriztion sẽ được xử lý bơi fragment shader. Dựa vào kết quả đó để quyết định các đầu ra như màu sắc, ánh sáng, độ bóng, phản chiếu, texture,… của các pixel.
- Output merger: Đây là nơi các pixel đã qua xử lý sẽ được kết hợp lại để tạo hình ảnh cuối cùng.
3. Ứng dụng
- Game: các trò chơi hiện nay phụ thuộc rất nhiều vào shader, từ mô hình nhân vật, các hiệu ứng đặc biệt như nước, mây, ánh sáng,.. cho đến các tương các của nhân vật với môi trường để đạt đến hình ảnh trung thực và sống động từ đó nâng cao trải nghiệm chơi game.
- Visual effect: Ngành công nghiệp phim và hoạt hình sử dụng shader để tạo ra CGI chân thật, các hệ thống hạt phực tạp, tích hợp liền mạch các phần đo máy tính tạo ra và các cảnh quay hành động trực tiếp.
- Data Visualization Applications: Ngoài các vai trong ngành giải trí, shader cũng đóng vai trò quan trọng các việc tạo ra các hình ảnh dữ liệu tương tác.
III. Tổng kết
Shader là một công cụ cực kỳ mạnh mẽ trong đồ họa máy tính, giúp tạo ra các hình ảnh 3D chân thực, sống động cùng các hiệu ứng đặc biệt khác. Tuy nhiên, việc lập trình shader không phải là một công việc dễ dàng. Nó đòi hỏi rất nhiều kiến thức chuyên sâu về đồ họa máy tính, toán học, vật lý, phần cứng GPU,…
IV. Phụ lục
- Introduction to Shader Graphics for data visualization
- https://www.shadertoy.com/
- The Book of Shaders: What is a shader?