Giới thiệu cơ bản về Shader trong Unity

Hello mọi người, hôm nay mình sẽ cùng mọi người tìm hiểu một thành phần không thể thiếu khi chúng ta xây dựng một trò chơi sử dụng Unity, đó chính là Shader. Mọi người có thể sẽ rất thắc mắc là Shader là gì? ứng dụng của Shader ở trong game như thế nào? vì thế trước tiên chúng ta sẽ đến với những ứng dụng của Shader ở trong video game.

Ứng Dụng Của Shader

  • khối nham thạch nóng chảy

1-4jiRNb-cmk7k5CnK1cq17w.png

  • Hiệu ứng nước

1-As8zH96o3A_AZuSAO7amvw.png

  • Làm cho model nhân vật thực tế hơn, ví dụ da người trong game có thể tương tác tốt với ánh sáng 1-8DXZ1WzNPKyzgcd3lyUjSg.png

  • Tạo ra các hiệu ứng tia lửa, dòng điện, mặt trời trong game 1-hO33BX5NGZ9LF3YivoqIeg.png

1-wGk-jr9MuPkDbYZr1wpjzQ.png

  • ngoài các ứng dụng trên Shader còn được sử dụng trong game để tạo ra các hiệu ứng trên màn hình như hiệu ứng phim cũ, làm mờ màn hình và các hiệu ứng tuyệt vời khác. Tiếp theo, chúng ta sẽ đi sâu hơn vào định nghĩa Shader là gì? Các kiểu Shader trong game.

Định Nghĩa Shader

Hmmm, Khi chúng ta yêu cầu máy tính thực hiện một hành động nào đó, chúng ta đưa vào máy tính các hướng dẫn để làm việc đó, và 1 tập các hướng dẫn cho máy tính thực hiện hành động nào đó thì dc gọi là Program. Vậy chúng ta có thể hiểu Shader là một chương trình được chạy trên GPU để tương tác với đối tượng trong game sau đó hiển thị chúng trên màn hình.

Phân Loại Shader

Trong những ngày đầu khi mà phần cứng đồ họa chưa phát triển mạnh như bây giờ thì Shader chỉ có một loại đó là Fixed Function shader với rất nhiều hạn chế khi nó được thiết lập sẵn trên các card đồ họa. Hiện nay, phần cứng đồ họa đã trở nên mạnh mẽ rất nhiều, nhiều bộ nhớ hơn, khả năng tính toán mạnh hơn cùng với đó thì các lập trình viên cũng được tiếp cận với nhiều loại Shader hơn và người ta gọi chung các loại Shader mới này là Programmable Shader còn Fixed Function shader là loại Non-Programmable Shader. Dựa trên tính năng và mục đích của shader mà chúng được phân loại như sau:

  • Vertex shader
  • Pixel shader
  • Geometry shader
  • Compute shader
  • Tessellation shader

Khi chúng ta muốn hiển thị đối tượng nào đó trên màn hình, đối tượng đó phải là một dạng đối tượng cơ bản hoặc là một mesh.

1-NgjlDGoEnTd-Vl3WBxVRBQ.png

ví dụ như trong ảnh trên, chúng ta đã hiển thị được hình dáng của một nhân vật, thực tế hình ảnh đó được tạo ra bởi một mesh hoặc vertices. Thêm vào đó, chúng ta còn có thể gán một hình ảnh vào mesh và chúng ta còn có thể làm cho nhân vật đó chuyển động. Nói một cách đơn giản, khi bạn muốn hiển thị một hình ảnh trong Unity3D trước hết bạn cần vẽ một mesh sau đó gán hình ảnh cho mesh đó và cuối cùng để có được hiệu ứng như mong muốn thì bạn cần viết shader tạo ra hiệu ứng đó rồi gán shader vào mesh. Tóm lại, để hiển thị bất cứ thứ gì trong Unity chúng ta đều phải vẽ ra một mesh. Vậy mesh là gì?

Mesh là sự kết hợp của vertices và các đối tượng cơ bản(Triangle, Line, Point).

0-f_Ciu8BNKaEAmGmc.png

Tiếp theo chúng ta sẽ đi sâu hơn vào các kiểu shader. Như chúng ta đã biết mesh được tạo ra bởi các vertices. Để vẽ ra vertices, chúng ta sẽ sử dụng Vertex shader. Vertex shader nhận thông tin về vị trí của vertex, màu của vertex... rồi hiển thị chúng ở trên màn hình.

1-Vy2YVTOjsED8HkzNF6MN8A.png

sau khi Vertex shader hiển thị các vertex trên screen, việc của chúng ta là làm thế nào để hiển thị phần diện tích giữa các vertex. Nói cách khác, làm thế nào để hiển thị các pixel giữa các vertex này. thì để làm được điều đó, chúng ta sẽ sử dụng Pixel shader hay còn gọi là Fragment shader - đây là một kiểu shader làm việc trên pixel hoặc fragment. Ở trong game thì CPU sẽ lặp đi lặp lại quá trình trên để hiển thị hình ảnh mà chúng ta mong muốn lên màn hình.

Trong bài viết tới, mình sẽ nói sâu hơn về cách viết một shader hoàn chỉnh trong Unity, và chúng ta sẽ đi sâu hơn về các loại shader khác nữa. Cảm ơn mọi người đã đọc bài và hẹn gặp lại!


All Rights Reserved