Cách hoạt động của kết xuất trò chơi 3D, Tìm hiểu sâu hơn: Rasterization và Ray Tracing

Trong phần thứ hai này của phần xem xét sâu hơn về kết xuất trò chơi 3D, chúng ta sẽ tập trung vào điều gì xảy ra với thế giới 3D sau khi tất cả quá trình xử lý đỉnh kết thúc. Chúng ta sẽ cần phải phủi bụi sách giáo khoa toán của mình một lần nữa, vật lộn với hình học của sự thất vọng và suy ngẫm về câu đố về quan điểm. Chúng ta cũng sẽ tìm hiểu nhanh về vật lý của phương pháp dò tia, ánh sáng và vật liệu – tuyệt vời!

Chủ đề chính của bài viết này là về một giai đoạn quan trọng trong quá trình dựng hình, trong đó thế giới ba chiều gồm các điểm, đường thẳng và hình tam giác trở thành một lưới hai chiều gồm các khối màu. Đây gần như là một điều gì đó chỉ ‘xảy ra’, vì các quá trình liên quan đến sự thay đổi từ 3D sang 2D xảy ra mà không nhìn thấy được, không giống như bài viết trước của chúng tôi, nơi chúng tôi có thể thấy ngay tác động của các vertex shader và tessellation. Nếu bạn chưa sẵn sàng cho tất cả những điều này, đừng lo lắng – bạn có thể bắt đầu với Kết xuất trò chơi 3D 101 của chúng tôi. Nhưng khi bạn đã sẵn sàng, hãy đọc phần tiếp theo của chúng tôi về thế giới đồ họa 3D.

Phần lớn các bạn sẽ xem trang web này trên màn hình phẳng hoàn toàn hoặc màn hình điện thoại thông minh; ngay cả khi bạn thích thú với bọn trẻ và có một màn hình cong đẹp mắt, hình ảnh mà nó hiển thị bao gồm một lưới phẳng các pixel màu. Chưa hết, khi bạn đang chơi Call of Mario: Death Duty Battleyard mới nhất, hình ảnh có vẻ là 3 chiều. Các đối tượng di chuyển vào và ra khỏi môi trường, trở nên lớn hơn hoặc nhỏ hơn khi chúng di chuyển đến và đi khỏi máy ảnh.

svg+xml,%3Csvg%20xmlns= Cách hoạt động của kết xuất trò chơi 3D, Tìm hiểu sâu hơn: Rasterization và Ray Tracing

Sử dụng Fallout 4 của Bethesda từ năm 2014 làm ví dụ, chúng ta có thể dễ dàng thấy cách các đỉnh đã được xử lý để tạo cảm giác về chiều sâu và khoảng cách, đặc biệt nếu chạy nó ở chế độ khung dây (ở trên).

Nếu bạn chọn bất kỳ trò chơi 3D nào ngày nay hoặc trong 2 thập kỷ qua, hầu hết mọi người trong số họ sẽ thực hiện cùng một chuỗi sự kiện để chuyển đổi thế giới 3D của các đỉnh thành mảng pixel 2D. Tên của quy trình thực hiện thay đổi thường được gọi là rasterization nhưng đó chỉ là một trong nhiều bước trong toàn bộ quy trình.

Chúng ta sẽ cần chia nhỏ một số giai đoạn khác nhau và kiểm tra các kỹ thuật và toán học được sử dụng, và để tham khảo, chúng ta sẽ sử dụng trình tự như Direct3D đã sử dụng để điều tra điều gì đang diễn ra. Hình ảnh bên dưới trình bày những gì được thực hiện đối với mỗi đỉnh trên thế giới:

svg+xml,%3Csvg%20xmlns= Cách hoạt động của kết xuất trò chơi 3D, Tìm hiểu sâu hơn: Rasterization và Ray Tracing

Chúng ta đã thấy những gì đã được thực hiện trong giai đoạn không gian thế giới trong bài viết Phần 1 của mình: ở đây các đỉnh được biến đổi và tô màu, sử dụng nhiều phép tính ma trận. Chúng ta sẽ bỏ qua phần tiếp theo vì tất cả những gì xảy ra đối với không gian máy ảnh là các đỉnh đã biến đổi được điều chỉnh sau khi chúng được di chuyển, để biến máy ảnh thành điểm tham chiếu.

Tuy nhiên, các bước tiếp theo quá quan trọng để bỏ qua, bởi vì chúng cực kỳ quan trọng để thực hiện thay đổi từ 3D sang 2D – được thực hiện đúng cách và bộ não của chúng ta sẽ nhìn vào màn hình phẳng nhưng “thấy” một cảnh có chiều sâu và tỷ lệ – đã xong sai, và mọi thứ sẽ trông rất kỳ lạ!

Bước đầu tiên trong trình tự này liên quan đến việc xác định trường nhìn mà máy ảnh nhìn thấy. Điều này được thực hiện bằng cách trước tiên đặt các góc cho trường nhìn ngang và dọc – góc nhìn đầu tiên thường có thể được thay đổi trong trò chơi, vì con người có tầm nhìn ngoại vi từ bên này sang bên kia tốt hơn so với nhìn từ trên xuống dưới.

Chúng ta có thể hiểu được điều này từ hình ảnh này cho thấy tầm nhìn của con người:

svg+xml,%3Csvg%20xmlns= Cách hoạt động của kết xuất trò chơi 3D, Tìm hiểu sâu hơn: Rasterization và Ray Tracing

Hai trường góc nhìn (viết tắt là fov) xác định hình dạng của một bức tượng – một kim tự tháp dựa trên hình vuông 3D, phát ra từ máy ảnh. Góc đầu tiên dành cho fov dọc , góc thứ hai là góc ngang ; chúng ta sẽ sử dụng các ký hiệu αβ để biểu thị chúng. Giờ đây, chúng ta không hoàn toàn nhìn thế giới theo cách này, nhưng việc tìm ra sự thất vọng về mặt tính toán sẽ dễ dàng hơn nhiều so với việc cố gắng tạo ra lượng xem thực tế.

svg+xml,%3Csvg%20xmlns= Cách hoạt động của kết xuất trò chơi 3D, Tìm hiểu sâu hơn: Rasterization và Ray Tracing

Hai cài đặt khác cũng cần được xác định – vị trí của các mặt cắt gần (hoặc phía trước) và xa (phía sau) . Cái trước cắt ra khỏi đỉnh của kim tự tháp nhưng về cơ bản xác định mức độ gần với vị trí của máy ảnh mà bất kỳ thứ gì được vẽ; cái sau cũng làm như vậy nhưng xác định khoảng cách từ máy ảnh mà bất kỳ nguyên mẫu nào sẽ được hiển thị.

Kích thước và vị trí của mặt phẳng cắt gần là quan trọng, vì nó trở thành cái được gọi là khung nhìn . Về cơ bản, đây là những gì bạn nhìn thấy trên màn hình, tức là khung được hiển thị và trong hầu hết các API đồ họa, chế độ xem được ‘vẽ’ từ góc trên cùng bên trái của nó. Trong hình bên dưới, điểm (a1, b2) sẽ là gốc tọa độ của mặt phẳng và chiều rộng cũng như chiều cao của mặt phẳng được đo từ đây.

Đọc thêm:  5 dấu hiệu ổ lưu trữ của bạn sắp hỏng

svg+xml,%3Csvg%20xmlns= Cách hoạt động của kết xuất trò chơi 3D, Tìm hiểu sâu hơn: Rasterization và Ray Tracing

Tỷ lệ khung hình của khung nhìn không chỉ quan trọng đối với cách thế giới được kết xuất sẽ xuất hiện, nó còn phải phù hợp với tỷ lệ khung hình của màn hình. Trong nhiều năm, tỷ lệ này luôn là 4:3 (hoặc 1,3333… dưới dạng giá trị thập phân). Tuy nhiên, ngày nay, nhiều người trong chúng ta chơi game với các tỷ lệ như 16:9 hoặc 21:9, hay còn gọi là màn hình rộng và màn hình siêu rộng.

Tọa độ của mỗi đỉnh trong không gian máy ảnh cần được chuyển đổi sao cho tất cả chúng đều vừa với mặt phẳng cắt gần, như minh họa bên dưới:

svg+xml,%3Csvg%20xmlns= Cách hoạt động của kết xuất trò chơi 3D, Tìm hiểu sâu hơn: Rasterization và Ray Tracing

Việc chuyển đổi được thực hiện bằng cách sử dụng một ma trận khác – ma trận cụ thể này được gọi là ma trận chiếu phối cảnh . Trong ví dụ của chúng tôi bên dưới, chúng tôi đang sử dụng trường góc nhìn và vị trí của các mặt phẳng cắt để thực hiện chuyển đổi; Tuy nhiên, chúng ta có thể sử dụng kích thước của khung nhìn.

svg+xml,%3Csvg%20xmlns= Cách hoạt động của kết xuất trò chơi 3D, Tìm hiểu sâu hơn: Rasterization và Ray Tracing

Vectơ vị trí đỉnh được nhân với ma trận này, tạo ra một tập hợp tọa độ được chuyển đổi mới.

svg+xml,%3Csvg%20xmlns= Cách hoạt động của kết xuất trò chơi 3D, Tìm hiểu sâu hơn: Rasterization và Ray Tracing

Và thì đấy! Bây giờ chúng ta có tất cả các đỉnh của mình được viết theo cách sao cho thế giới ban đầu hiện xuất hiện dưới dạng phối cảnh 3D bắt buộc, do đó, các phần nguyên thủy gần mặt phẳng cắt phía trước xuất hiện lớn hơn các phần tử gần mặt phẳng xa hơn.

Mặc dù kích thước của khung nhìn và trường của các góc nhìn được liên kết với nhau, nhưng chúng có thể được xử lý riêng biệt – nói cách khác, bạn có thể thiết lập sự thất vọng để cung cấp cho bạn một mặt phẳng cắt gần có kích thước và tỷ lệ khung hình khác với khung nhìn. Để điều này xảy ra, cần phải thực hiện một bước bổ sung trong chuỗi, trong đó các đỉnh trong mặt phẳng cắt gần cần được biến đổi lại, để giải thích cho sự khác biệt.

Tuy nhiên, điều này có thể dẫn đến biến dạng trong phối cảnh được xem. Sử dụng trò chơi Skyrim năm 2011 của Bethesda, chúng ta có thể thấy cách điều chỉnh trường nhìn ngang của góc nhìn β , trong khi vẫn giữ nguyên tỷ lệ khung hình của khung nhìn, có ảnh hưởng đáng kể đến cảnh:

svg+xml,%3Csvg%20xmlns= Cách hoạt động của kết xuất trò chơi 3D, Tìm hiểu sâu hơn: Rasterization và Ray Tracing

Trong hình ảnh đầu tiên này, chúng tôi đã đặt β = 75° và cảnh có vẻ hoàn toàn bình thường. Bây giờ hãy thử với β = 120°:

svg+xml,%3Csvg%20xmlns= Cách hoạt động của kết xuất trò chơi 3D, Tìm hiểu sâu hơn: Rasterization và Ray Tracing

Có hai sự khác biệt rõ ràng ngay lập tức – trước hết, giờ đây chúng ta có thể nhìn thấy nhiều hơn về các phía của ‘tầm nhìn’ của mình và thứ hai, các vật thể giờ đây dường như ở xa hơn nhiều (đặc biệt là cây cối). Tuy nhiên, hiệu ứng hình ảnh của mặt nước hiện không giống như hiện tại và điều này là do quy trình không được thiết kế cho trường nhìn này.

Bây giờ, giả sử nhân vật của chúng ta có đôi mắt giống người ngoài hành tinh và đặt β = 180°!

svg+xml,%3Csvg%20xmlns= Cách hoạt động của kết xuất trò chơi 3D, Tìm hiểu sâu hơn: Rasterization và Ray Tracing

Trường nhìn này cung cấp cho chúng ta một cảnh gần như toàn cảnh nhưng phải trả giá bằng một mức độ biến dạng nghiêm trọng đối với các đối tượng được hiển thị ở các cạnh của chế độ xem. Một lần nữa, điều này là do các nhà thiết kế trò chơi đã không lập kế hoạch và tạo nội dung của trò chơi cũng như hiệu ứng hình ảnh cho góc nhìn này (giá trị mặc định là khoảng 70°).

Có vẻ như máy ảnh đã di chuyển trong các hình ảnh trên, nhưng thực tế không phải vậy – tất cả những gì đã xảy ra là hình dạng của khối bị thay đổi, từ đó định hình lại kích thước của mặt phẳng cắt gần nhất. Trong mỗi hình ảnh, tỷ lệ khung hình của khung nhìn vẫn giữ nguyên, do đó, một ma trận chia tỷ lệ đã được áp dụng cho các đỉnh để làm cho mọi thứ khớp trở lại.

Sau khi mọi thứ đã được chuyển đổi chính xác trong giai đoạn chiếu, chúng tôi sẽ chuyển sang phần được gọi là không gian clip . Mặc dù điều này được thực hiện sau khi chiếu, nhưng sẽ dễ hình dung hơn những gì đang diễn ra nếu chúng ta thực hiện trước:

svg+xml,%3Csvg%20xmlns= Cách hoạt động của kết xuất trò chơi 3D, Tìm hiểu sâu hơn: Rasterization và Ray Tracing

Trong sơ đồ trên của chúng tôi, chúng ta có thể thấy rằng con vịt cao su, một trong những con dơi và một số cây sẽ có hình tam giác bên trong quả mâm xôi; tuy nhiên, con dơi khác, cái cây xa nhất và gấu trúc đều nằm ngoài sự thất vọng. Mặc dù các đỉnh tạo nên các đối tượng này đã được xử lý nhưng chúng sẽ không được nhìn thấy trong khung nhìn. Điều đó có nghĩa là họ bị cắt bớt .

Trong clipping bực bội , bất kỳ nguyên thủy nào bên ngoài sự thất vọng đều bị loại bỏ hoàn toàn và những gì nằm trên bất kỳ ranh giới nào được định hình lại thành các nguyên thủy mới. Clipping không thực sự giúp tăng hiệu suất nhiều, vì tất cả các đỉnh không nhìn thấy được đã được chạy qua các trình tạo bóng đỉnh, v.v. cho đến thời điểm này. Bản thân giai đoạn cắt cũng có thể được bỏ qua, nếu được yêu cầu, nhưng điều này không được tất cả các API hỗ trợ (ví dụ: OpenGL tiêu chuẩn sẽ không cho phép bạn bỏ qua giai đoạn này, trong khi bạn có thể làm như vậy bằng cách sử dụng tiện ích mở rộng API) .

svg+xml,%3Csvg%20xmlns= Cách hoạt động của kết xuất trò chơi 3D, Tìm hiểu sâu hơn: Rasterization và Ray Tracing

Điều đáng chú ý là vị trí của mặt phẳng cắt xa không nhất thiết phải giống với khoảng cách vẽ trong trò chơi, vì vị trí sau được điều khiển bởi chính công cụ trò chơi. Một thứ khác mà công cụ sẽ thực hiện là loại bỏ sự thất vọng – đây là nơi mã được chạy để xác định xem một đối tượng có nằm trong sự thất vọng hay không và/hoặc ảnh hưởng đến bất kỳ thứ gì sẽ hiển thị; nếu câu trả lời là không , thì đối tượng đó không được gửi để hiển thị. Điều này không giống như việc cắt bớt thất vọng, vì mặc dù các nguyên hàm bên ngoài thất vọng bị loại bỏ, nhưng chúng vẫn được chạy qua giai đoạn xử lý đỉnh. Với loại bỏ, chúng hoàn toàn không được xử lý, tiết kiệm khá nhiều hiệu suất.

Đọc thêm:  Khách hàng nhắn tin di động được so sánh

Bây giờ chúng ta đã thực hiện xong tất cả các chuyển đổi và cắt bớt, có vẻ như các đỉnh cuối cùng đã sẵn sàng cho giai đoạn tiếp theo trong toàn bộ trình tự kết xuất. Ngoại trừ, họ không. Điều này là do tất cả các phép toán được thực hiện trong quá trình xử lý đỉnh và các phép toán không gian từ thế giới đến clip phải được thực hiện với một hệ tọa độ đồng nhất (nghĩa là mỗi đỉnh có 4 thành phần, thay vì 3). Tuy nhiên, chế độ xem hoàn toàn là 2D và do đó, API mong đợi thông tin về đỉnh chỉ có các giá trị cho x, y (mặc dù giá trị độ sâu z được giữ lại).

Để loại bỏ thành phần thứ 4, phép chia phối cảnh được thực hiện trong đó mỗi thành phần được chia cho giá trị w . Sự điều chỉnh này khóa phạm vi giá trị xy có thể nhận vào [-1,1] và z trong phạm vi [0,1] – chúng được gọi là tọa độ thiết bị chuẩn hóa (viết tắt là NDC).

Nếu bạn muốn biết thêm thông tin về những gì chúng tôi vừa đề cập và bạn rất vui khi tìm hiểu sâu hơn về toán học, thì hãy đọc hướng dẫn tuyệt vời của Song Ho Ahn về chủ đề này. Bây giờ, hãy biến những đỉnh đó thành pixel!

Đối với các phép biến đổi, chúng ta sẽ xem xét cách Direct3D thiết lập các quy tắc và quy trình để biến chế độ xem thành một lưới các pixel. Lưới này giống như một bảng tính, với các hàng và cột, trong đó mỗi ô chứa nhiều giá trị dữ liệu (chẳng hạn như màu sắc, giá trị độ sâu, tọa độ kết cấu, v.v.). Thông thường, lưới này được gọi là raster và quá trình tạo ra nó được gọi là rasterization . Trong bài viết 101 về kết xuất 3D của chúng tôi, chúng tôi đã có một cái nhìn rất đơn giản về quy trình:

svg+xml,%3Csvg%20xmlns= Cách hoạt động của kết xuất trò chơi 3D, Tìm hiểu sâu hơn: Rasterization và Ray Tracing

Hình ảnh trên tạo ấn tượng rằng các nguyên thủy chỉ được cắt nhỏ thành các khối nhỏ, nhưng còn nhiều điều hơn thế nữa. Bước đầu tiên là tìm hiểu xem liệu một con nguyên thủy có thực sự đối mặt với máy ảnh hay không – trong một hình ảnh trước đó trong bài viết này, một bức ảnh thể hiện sự thất vọng, chẳng hạn như những con nguyên thủy tạo nên lưng của con thỏ xám, sẽ không dễ thấy. Vì vậy, mặc dù chúng sẽ có mặt trong chế độ xem, nhưng không cần hiển thị chúng.

Chúng ta có thể hiểu sơ bộ về điều này trông như thế nào với sơ đồ sau. Khối lập phương đã trải qua nhiều biến đổi khác nhau để đưa mô hình 3D vào không gian màn hình 2D và từ chế độ xem của máy ảnh, một số mặt của khối không hiển thị. Nếu chúng ta giả sử rằng không có bề mặt nào trong suốt, thì có thể bỏ qua một số bề mặt nguyên thủy này.

svg+xml,%3Csvg%20xmlns= Cách hoạt động của kết xuất trò chơi 3D, Tìm hiểu sâu hơn: Rasterization và Ray Tracing

Trong Direct3D, điều này có thể đạt được bằng cách cho hệ thống biết trạng thái kết xuất sẽ như thế nào và hướng dẫn này sẽ yêu cầu hệ thống loại bỏ (còn gọi là loại bỏ ) mặt trước hoặc mặt sau đối với mỗi nguyên mẫu (hoặc không loại bỏ chút nào – đối với ví dụ, chế độ khung dây ). Nhưng làm thế nào nó biết mặt trước hay mặt sau? Khi chúng tôi xem xét phép toán trong quá trình xử lý đỉnh, chúng tôi thấy rằng các hình tam giác (hoặc đúng hơn là trường hợp của các đỉnh) có các vectơ pháp tuyến cho hệ thống biết hướng của nó. Với thông tin đó, có thể thực hiện một kiểm tra đơn giản và nếu kiểm tra gốc không thành công, thì kiểm tra đó sẽ bị loại khỏi chuỗi kết xuất.

Tiếp theo, đã đến lúc bắt đầu áp dụng lưới pixel. Một lần nữa, điều này phức tạp một cách đáng ngạc nhiên, bởi vì hệ thống phải tính xem một pixel có vừa với một pixel nguyên thủy hay không – hoàn toàn, một phần hoặc không. Để làm điều này, một quá trình được gọi là thử nghiệm bảo hiểm được thực hiện. Hình ảnh bên dưới cho thấy cách các hình tam giác được rasterized trong Direct3D 11:

svg+xml,%3Csvg%20xmlns= Cách hoạt động của kết xuất trò chơi 3D, Tìm hiểu sâu hơn: Rasterization và Ray Tracing

Quy tắc khá đơn giản: một pixel được coi là nằm trong một hình tam giác nếu tâm pixel vượt qua cái mà Microsoft gọi là quy tắc ‘trên cùng bên trái’. Phần ‘trên cùng’ là kiểm tra đường ngang; trung tâm pixel phải nằm trên dòng này. Phần ‘bên trái’ dành cho các đường không nằm ngang và trung tâm pixel phải nằm ở bên trái của một đường như vậy. Có các quy tắc bổ sung cho các điểm không nguyên thủy, tức là các đường và điểm đơn giản, và các quy tắc này đạt được các điều kiện bổ sung nếu sử dụng đa mẫu .

Đọc thêm:  Đánh giá ASUS Maximus Formula (Phiên bản đặc biệt)

Nếu chúng ta xem xét kỹ hình ảnh từ tài liệu của Microsoft, chúng ta có thể thấy rằng các hình dạng được tạo bởi các pixel trông không giống các hình dạng ban đầu cho lắm. Điều này là do các pixel quá lớn để tạo ra một hình tam giác thực tế – raster chứa không đủ dữ liệu về các đối tượng ban đầu, dẫn đến một vấn đề gọi là răng cưa .

Hãy sử dụng 3DMark03 của UL Benchmark để xem hoạt động của răng cưa:

svg+xml,%3Csvg%20xmlns= Cách hoạt động của kết xuất trò chơi 3D, Tìm hiểu sâu hơn: Rasterization và Ray Tracing

Trong hình ảnh đầu tiên, raster được đặt ở kích thước rất thấp 720 x 480 pixel. Có thể nhìn thấy rõ răng cưa trên tay vịn và bóng đổ của khẩu súng do người lính hàng đầu cầm. So sánh điều này với những gì bạn nhận được với một raster có nhiều pixel hơn 24 lần:

svg+xml,%3Csvg%20xmlns= Cách hoạt động của kết xuất trò chơi 3D, Tìm hiểu sâu hơn: Rasterization và Ray Tracing

Ở đây chúng ta có thể thấy răng cưa trên tay vịn và bóng đã hoàn toàn biến mất. Một raster lớn hơn dường như luôn là cách tốt nhất nhưng kích thước của lưới phải được màn hình hỗ trợ mà khung sẽ hiển thị trên đó và với điều kiện là các pixel đó phải được xử lý, sau quá trình rasterization, sẽ có là một hình phạt hiệu suất rõ ràng.

Đây là nơi mà tính năng đa mẫu có thể trợ giúp và đây là cách tính năng này hoạt động trong Direct3D:

svg+xml,%3Csvg%20xmlns= Cách hoạt động của kết xuất trò chơi 3D, Tìm hiểu sâu hơn: Rasterization và Ray Tracing

Thay vì chỉ kiểm tra xem trung tâm pixel có đáp ứng quy tắc rasterization hay không, thay vào đó, nhiều vị trí (được gọi là mẫu pixel phụ hoặc mẫu phụ ) trong mỗi pixel được kiểm tra và nếu bất kỳ vị trí nào trong số đó đều ổn thì toàn bộ pixel đó sẽ tạo thành một phần của hình. Điều này dường như không có lợi ích gì và thậm chí có thể làm cho răng cưa trở nên tồi tệ hơn, nhưng khi sử dụng đa mẫu, thông tin về mẫu phụ nào được bao phủ bởi mẫu nguyên thủy và kết quả xử lý pixel được lưu trữ trong bộ đệm trong bộ nhớ.

Bộ đệm này sau đó được sử dụng để trộn dữ liệu mẫu phụ và pixel theo cách sao cho các cạnh của mẫu nguyên thủy ít khối hơn. Chúng ta sẽ xem xét lại toàn bộ tình huống răng cưa trong một bài viết sau, nhưng hiện tại, đây là điều mà việc lấy nhiều mẫu có thể thực hiện khi được sử dụng trên một raster có quá ít pixel:

svg+xml,%3Csvg%20xmlns= Cách hoạt động của kết xuất trò chơi 3D, Tìm hiểu sâu hơn: Rasterization và Ray Tracing

Chúng ta có thể thấy rằng số lượng răng cưa trên các cạnh của các hình dạng khác nhau đã được giảm đi rất nhiều. Một raster lớn hơn chắc chắn là tốt hơn, nhưng thay vào đó, hiệu suất đạt được có thể ủng hộ việc sử dụng đa mẫu.

Một thứ khác có thể được thực hiện trong quá trình rasterization là kiểm tra tắc nghẽn . Điều này phải được thực hiện bởi vì khung nhìn sẽ chứa đầy các hình nguyên thủy sẽ chồng lên nhau ( bị che khuất ) – ví dụ: trong hình trên, các hình tam giác phía trước tạo nên người lính ở phía trước chồng lên các hình tam giác tương tự ở người lính kia. Cũng như việc kiểm tra xem một pixel nguyên thủy có bao phủ một pixel hay không, độ sâu tương đối cũng có thể được so sánh và nếu cái này đứng sau cái kia, thì nó có thể bị bỏ qua khỏi phần còn lại của quá trình kết xuất.

Tuy nhiên, nếu phần nguyên thủy gần nhất trong suốt, thì phần tiếp theo vẫn có thể nhìn thấy được, mặc dù nó đã thất bại trong việc kiểm tra tắc. Đây là lý do tại sao gần như tất cả các công cụ 3D đều thực hiện kiểm tra tắc trước khi gửi bất kỳ thứ gì tới GPU và thay vào đó, tạo ra một thứ gọi là bộ đệm z như một phần của quy trình kết xuất. Đây là nơi khung hình được tạo như bình thường nhưng thay vì lưu trữ các màu pixel cuối cùng trong bộ nhớ, GPU chỉ lưu trữ các giá trị độ sâu. Điều này sau đó có thể được sử dụng trong các trình đổ bóng để kiểm tra khả năng hiển thị với khả năng kiểm soát và độ chính xác cao hơn đối với các khía cạnh liên quan đến chồng chéo đối tượng.

svg+xml,%3Csvg%20xmlns= Cách hoạt động của kết xuất trò chơi 3D, Tìm hiểu sâu hơn: Rasterization và Ray Tracing

Trong hình trên, màu của pixel càng đậm thì đối tượng đó càng gần máy ảnh. Khung được hiển thị một lần, để tạo bộ đệm z, sau đó được hiển thị lại nhưng lần này khi các pixel được xử lý, một trình đổ bóng được chạy để kiểm tra chúng với các giá trị trong bộ đệm z. Nếu nó không hiển thị, thì màu pixel đó không được đưa vào bộ đệm khung hình cuối cùng.

Hiện tại, bước cuối cùng chính là thực hiện phép nội suy thuộc tính đỉnh – trong sơ đồ đơn giản hóa ban đầu của chúng ta, hình nguyên thủy là một hình tam giác hoàn chỉnh, nhưng đừng quên rằng khung nhìn chỉ được lấp đầy bởi các góc của hình chứ không phải chính hình đó. Vì vậy, hệ thống phải tìm ra màu sắc, độ sâu và kết cấu của hình nguyên thủy ở giữa các đỉnh và điều này được gọi là phép nội suy . Như bạn có thể tưởng tượng, đây là một phép tính khác, và cũng không phải là một phép tính đơn giản.

Mặc dù thực tế là màn hình rasterized là 2D, các cấu trúc bên trong nó thể hiện phối cảnh 3D bắt buộc. Nếu các đường thẳng thực sự là 2 chiều, thì chúng ta có thể sử dụng một phương trình tuyến tính đơn giản để tìm ra các màu khác nhau, v.v. khi chúng ta đi từ đỉnh này sang đỉnh khác. Nhưng vì khía cạnh 3D của cảnh, phép nội suy cần tính đến phối cảnh – hãy đọc blog tuyệt vời của Simon Yeung về chủ đề này để biết thêm thông tin về quy trình.

Đọc thêm:  Cuộc phỏng vấn với người sáng lập Raspberry Eben Upton

Vậy là xong – đó là cách thế giới 3D của các đỉnh trở thành một lưới 2D gồm các khối màu. Tuy nhiên, chúng tôi vẫn chưa hoàn thành.

Trước khi kết thúc quá trình xem xét rasterization, chúng ta cần nói điều gì đó về thứ tự của trình tự kết xuất. Ví dụ, chúng ta không nói về việc tessellation xuất hiện ở đâu trong trình tự; thay vào đó, chúng tôi đang đề cập đến thứ tự mà các nguyên thủy được xử lý. Các đối tượng thường được xử lý theo thứ tự xuất hiện trong bộ đệm chỉ mục (khối bộ nhớ cho hệ thống biết cách các đỉnh được nhóm lại với nhau) và điều này có thể có tác động đáng kể đến cách xử lý các đối tượng và hiệu ứng trong suốt.

Lý do cho điều này là do các nguyên mẫu được xử lý cùng một lúc và nếu bạn hiển thị những cái ở phía trước trước, bất kỳ cái nào ở phía sau chúng sẽ không hiển thị (đây là lúc loại bỏ tắc thực sự phát huy tác dụng) và có thể bị loại bỏ khỏi quy trình (giúp tăng hiệu suất) – điều này thường được gọi là kết xuất ‘ từ trước đến sau’ và yêu cầu bộ đệm chỉ mục được sắp xếp theo cách này.

Tuy nhiên, nếu một số vật thể nguyên thủy ngay phía trước máy ảnh trong suốt, thì kết xuất từ trước ra sau sẽ dẫn đến các vật thể phía sau vật thể trong suốt bị bỏ sót. Thay vào đó, một giải pháp là kết xuất mọi thứ từ trước ra sau, với các hiệu ứng và hiệu ứng gốc trong suốt được thực hiện sau cùng.

svg+xml,%3Csvg%20xmlns= Cách hoạt động của kết xuất trò chơi 3D, Tìm hiểu sâu hơn: Rasterization và Ray Tracing

Vì vậy, tất cả các trò chơi hiện đại đều hiển thị từ trước ra sau, phải không? Không, nếu có thể giúp được – đừng quên rằng việc hiển thị mọi nguyên mẫu đơn lẻ sẽ có chi phí hiệu năng cao hơn nhiều so với việc chỉ hiển thị những thứ có thể nhìn thấy được. Có nhiều cách khác để xử lý các đối tượng trong suốt, nhưng nói chung, không có giải pháp nào phù hợp cho tất cả và mọi tình huống cần được xử lý một cách độc đáo.

Về cơ bản, điều này tóm tắt những ưu và nhược điểm của quá trình tạo điểm ảnh – trên phần cứng hiện đại, quá trình này thực sự nhanh và hiệu quả, nhưng nó vẫn chỉ là một phép tính gần đúng với những gì chúng ta thấy. Trong thế giới thực, mọi vật thể sẽ hấp thụ, phản xạ và có thể khúc xạ ánh sáng, và tất cả những điều này đều có ảnh hưởng đến cảnh được xem. Bằng cách chia thế giới thành các nguyên thủy và sau đó chỉ hiển thị một số trong số chúng, chúng tôi nhận được kết quả nhanh nhưng thô.

Nếu chỉ có một cách khác …

Gần năm thập kỷ trước, một nhà khoa học máy tính tên là Arthur Appel đã tạo ra một hệ thống hiển thị hình ảnh trên máy tính, theo đó một tia sáng duy nhất được chiếu theo một đường thẳng từ máy ảnh cho đến khi nó chiếu vào một vật thể. Từ đó, các thuộc tính của vật liệu (màu sắc, độ phản chiếu, v.v.) sẽ thay đổi cường độ của tia sáng. Mỗi pixel trong hình ảnh được hiển thị sẽ có một tia và một thuật toán sẽ được thực hiện, trải qua một chuỗi phép toán để tìm ra màu của pixel. Quá trình của Appel được gọi là đúc tia.

Khoảng 10 năm sau, một nhà khoa học khác tên là John Whitted đã phát triển một thuật toán toán học giống như cách tiếp cận của Appel, nhưng khi tia chiếu vào một vật thể, nó sẽ tạo ra các tia bổ sung, các tia này sẽ bắn ra theo nhiều hướng khác nhau tùy thuộc vào vật liệu của vật thể. Bởi vì hệ thống này sẽ tạo ra các tia mới cho mỗi tương tác đối tượng, thuật toán có tính chất đệ quy và do đó khó tính toán hơn rất nhiều; tuy nhiên, nó có một lợi thế đáng kể so với phương pháp của Appel vì nó có thể tính toán chính xác phản xạ, khúc xạ và bóng đổ. Tên của quy trình này là dò tia (nói đúng ra, đó là dò tia ngược , khi chúng ta đi theo tia từ máy ảnh chứ không phải từ các đối tượng) và nó đã trở thành chén thánh cho đồ họa máy tính và phim ảnh kể từ đó.

Tên của quy trình này là dò tia (nói đúng ra, đó là dò tia ngược, khi chúng ta đi theo tia từ máy ảnh chứ không phải từ các đối tượng) và nó đã trở thành chén thánh cho đồ họa máy tính và phim ảnh kể từ đó.

svg+xml,%3Csvg%20xmlns= Cách hoạt động của kết xuất trò chơi 3D, Tìm hiểu sâu hơn: Rasterization và Ray Tracing

Trong hình trên, chúng ta có thể hiểu được thuật toán của Whitted hoạt động như thế nào. Một tia được truyền từ máy ảnh, cho từng pixel trong khung và di chuyển cho đến khi chạm tới một bề mặt. Bề mặt đặc biệt này trong mờ, vì vậy ánh sáng sẽ phản xạ và khúc xạ qua nó. Các tia thứ cấp được tạo ra cho cả hai trường hợp và những tia này truyền đi cho đến khi chúng tương tác với một bề mặt. Có bổ sung thứ cấp, để giải thích cho màu sắc của các nguồn ánh sáng và bóng mà chúng tạo ra, cũng được tạo ra.

Đọc thêm:  Xây dựng PC Mini-ITX mỏng: Hiệu suất nhỏ và yên tĩnh

Phần đệ quy của quy trình là các tia thứ cấp có thể được tạo ra mỗi khi một tia mới đúc giao nhau với một bề mặt. Điều này có thể dễ dàng vượt khỏi tầm kiểm soát, vì vậy số lượng tia thứ cấp được tạo ra luôn bị hạn chế. Khi một đường tia hoàn thành, màu của nó tại mỗi điểm cuối được tính toán, dựa trên các đặc tính vật liệu của bề mặt đó. Sau đó, giá trị này được truyền xuống tia tới tia trước đó, điều chỉnh màu cho bề mặt đó, v.v., cho đến khi chúng ta đạt đến điểm bắt đầu hiệu quả của tia chính: pixel trong khung.

Điều này có thể cực kỳ phức tạp và thậm chí các tình huống đơn giản cũng có thể tạo ra một loạt các phép tính cần thực hiện. May mắn thay, có một số điều có thể được thực hiện để trợ giúp – một là sử dụng phần cứng được thiết kế đặc biệt để tăng tốc các phép toán cụ thể này, giống như cách thực hiện toán ma trận trong xử lý đỉnh (thêm về điều này trong giây lát) . Một điều quan trọng khác là cố gắng tăng tốc quá trình đã hoàn thành để tìm ra đối tượng mà tia chiếu vào và vị trí chính xác trên bề mặt của đối tượng mà giao điểm xảy ra – nếu đối tượng được tạo thành từ nhiều hình tam giác, điều này có thể khó một cách đáng ngạc nhiên làm:

svg+xml,%3Csvg%20xmlns= Cách hoạt động của kết xuất trò chơi 3D, Tìm hiểu sâu hơn: Rasterization và Ray Tracing

Thay vì kiểm tra từng tam giác đơn lẻ, trong từng đối tượng riêng lẻ, một danh sách các thể tích giới hạn (BV) được tạo trước khi dò tia – đây không gì khác hơn là các khối lập phương bao quanh đối tượng được đề cập, với các khối nhỏ hơn liên tiếp được tạo cho các cấu trúc khác nhau trong đối tượng sự vật.

Ví dụ, BV đầu tiên sẽ dành cho cả con thỏ. Cặp tiếp theo sẽ che đầu, chân, thân, đuôi, v.v.; mỗi một trong số này sau đó sẽ là một tập hợp các khối khác cho các cấu trúc nhỏ hơn ở phần đầu, v.v., với mức khối cuối cùng chứa một số lượng nhỏ các hình tam giác để kiểm tra. Tất cả các tập này sau đó được sắp xếp trong một danh sách có thứ tự (được gọi là hệ thống phân cấp BV hoặc viết tắt là BVH) sao cho mỗi lần hệ thống sẽ kiểm tra một số lượng tương đối nhỏ các BV:

svg+xml,%3Csvg%20xmlns= Cách hoạt động của kết xuất trò chơi 3D, Tìm hiểu sâu hơn: Rasterization và Ray Tracing

Mặc dù việc sử dụng BVH không tăng tốc độ theo dõi tia thực tế về mặt kỹ thuật, nhưng việc tạo cấu trúc phân cấp và thuật toán tìm kiếm tiếp theo cần thiết, thường nhanh hơn nhiều so với việc phải kiểm tra xem liệu một tia có giao nhau với một trong số hàng triệu hình tam giác hay không trong một thế giới 3D.

Ngày nay, các chương trình như Blender và POV-ray sử dụng phương pháp dò tia với các thuật toán bổ sung (chẳng hạn như dò photon và bức xạ) để tạo ra hình ảnh có độ chân thực cao:

svg+xml,%3Csvg%20xmlns= Cách hoạt động của kết xuất trò chơi 3D, Tìm hiểu sâu hơn: Rasterization và Ray Tracing

Câu hỏi rõ ràng là nếu dò tia tốt như vậy, tại sao chúng ta không sử dụng nó ở mọi nơi? Câu trả lời nằm trong hai lĩnh vực: trước hết, ngay cả phương pháp dò tia đơn giản cũng tạo ra hàng triệu tia phải được tính đi tính lại. Hệ thống bắt đầu chỉ với một tia trên mỗi pixel màn hình, do đó, ở độ phân giải chỉ 800 x 600, tạo ra 480.000 tia chính và sau đó mỗi tia tạo ra nhiều tia phụ. Đây thực sự là công việc khó khăn đối với cả những chiếc máy tính để bàn ngày nay. Vấn đề thứ hai là phương pháp dò tia cơ bản không thực tế lắm và cần phải đưa vào một loạt các phương trình bổ sung, rất phức tạp để làm cho đúng.

Ngay cả với phần cứng PC hiện đại, khối lượng công việc cần thiết vẫn vượt quá phạm vi để thực hiện điều này trong thời gian thực đối với một trò chơi 3D hiện tại. Trong bài viết 101 về kết xuất 3D của chúng tôi, chúng tôi đã thấy trong một điểm chuẩn theo dõi tia, phải mất hàng chục giây để tạo ra một hình ảnh có độ phân giải thấp.

Vậy bản gốc Wolfenstein 3D đã thực hiện tính năng dò tia như thế nào, từ năm 1992, và tại sao những tựa game như Battlefield V và Metro Exodus, cả hai đều được phát hành vào năm 2019, lại cung cấp khả năng dò tia? Họ đang làm rasterization hoặc ray tracing? Câu trả lời là: một chút của cả hai.

Vào tháng 3 năm 2018, Microsoft đã công bố một tiện ích mở rộng API mới cho Direct3D 12, được gọi là DXR (DirectX Raytracing). Đây là một quy trình đồ họa mới, một quy trình bổ sung cho quy trình tính toán và rasterization tiêu chuẩn. Chức năng bổ sung được cung cấp thông qua việc giới thiệu các trình đổ bóng, cấu trúc dữ liệu, v.v., nhưng không yêu cầu bất kỳ hỗ trợ phần cứng cụ thể nào – ngoài điều đã được yêu cầu cho Direct3D 12.

svg+xml,%3Csvg%20xmlns= Cách hoạt động của kết xuất trò chơi 3D, Tìm hiểu sâu hơn: Rasterization và Ray Tracing

Tại cùng Hội nghị các nhà phát triển trò chơi, nơi Microsoft nói về DXR, Electronic Arts đã nói về Dự án Pica Pica của họ – một thử nghiệm công cụ 3D sử dụng DXR. Họ đã chỉ ra rằng có thể sử dụng phương pháp dò tia, nhưng không dành cho toàn bộ khung hình kết xuất. Thay vào đó, các kỹ thuật đổ bóng tính toán và rasterization truyền thống sẽ được sử dụng cho phần lớn công việc, với DXR được sử dụng cho các khu vực cụ thể – điều này có nghĩa là số lượng tia được tạo ra nhỏ hơn nhiều so với số lượng cho toàn bộ cảnh.

Đọc thêm:  Cách tùy chỉnh Menu ngữ cảnh Windows 10: Thêm, xóa mục và hơn thế nữa

svg+xml,%3Csvg%20xmlns= Cách hoạt động của kết xuất trò chơi 3D, Tìm hiểu sâu hơn: Rasterization và Ray Tracing

Cách tiếp cận hỗn hợp này đã được sử dụng trong quá khứ, mặc dù ở mức độ thấp hơn. Ví dụ: Wolfenstein 3D đã sử dụng tính năng truyền tia để tìm ra cách khung hình hiển thị sẽ xuất hiện, mặc dù nó được thực hiện với một tia trên mỗi cột pixel, thay vì trên mỗi pixel. Điều này có vẻ vẫn rất ấn tượng, cho đến khi bạn nhận ra rằng trò chơi ban đầu chạy ở độ phân giải 640 x 480, vì vậy không có nhiều hơn 640 tia chạy cùng lúc.

Card đồ họa đầu năm 2018 – như Radeon RX 580 của AMD hoặc GeForce 1080 Ti của Nvidia – chắc chắn đã đáp ứng các yêu cầu phần cứng cho DXR nhưng ngay cả với khả năng tính toán của chúng, vẫn có một số nghi ngờ rằng chúng sẽ đủ mạnh để thực sự sử dụng DXR trong bất kỳ cách có ý nghĩa.

Điều này đã phần nào thay đổi vào tháng 8 năm 2018, khi Nvidia ra mắt kiến trúc GPU mới nhất của họ, có tên mã là Turing. Tính năng quan trọng của con chip này là sự ra đời của cái gọi là Lõi RT: đơn vị logic chuyên dụng để tăng tốc giao điểm tam giác tia và tính toán phân cấp khối lượng giới hạn (BVH). Hai quy trình này là những quy trình tốn thời gian để tìm ra nơi ánh sáng tương tác với các hình tam giác tạo nên các đối tượng khác nhau trong một cảnh. Do các Lõi RT là duy nhất đối với bộ xử lý Turing, nên việc truy cập chúng chỉ có thể được thực hiện thông qua API độc quyền của Nvidia.

Trò chơi đầu tiên hỗ trợ tính năng này là Battlefield V của EA và khi chúng tôi thử nghiệm việc sử dụng DXR, chúng tôi đã rất ấn tượng bởi sự cải thiện đối với phản xạ nước, thủy tinh và kim loại trong trò chơi, nhưng ít hơn với hiệu suất đạt được sau đó:

svg+xml,%3Csvg%20xmlns= Cách hoạt động của kết xuất trò chơi 3D, Tìm hiểu sâu hơn: Rasterization và Ray Tracing

Công bằng mà nói, các bản vá lỗi sau này đã cải thiện phần nào vấn đề nhưng đã (và vẫn đang) giảm tốc độ hiển thị khung hình. Đến năm 2019, một số trò chơi khác đã xuất hiện hỗ trợ API này, thực hiện dò tia cho các phần cụ thể trong khung. Chúng tôi đã thử nghiệm Metro Exodus và Shadow of the Tomb Raider, và tìm thấy một câu chuyện tương tự – khi nó được sử dụng nhiều, DXR sẽ ảnh hưởng đáng kể đến tốc độ khung hình.

Cũng trong khoảng thời gian đó, UL Benchmarks đã công bố thử nghiệm tính năng DXR cho 3DMark:

svg+xml,%3Csvg%20xmlns= Cách hoạt động của kết xuất trò chơi 3D, Tìm hiểu sâu hơn: Rasterization và Ray Tracing

Tuy nhiên, quá trình kiểm tra các trò chơi hỗ trợ DXR và kiểm tra tính năng 3DMark của chúng tôi đã chứng minh một điều chắc chắn về tính năng dò tia: vào năm 2019, bộ xử lý đồ họa vẫn hoạt động cực kỳ khó khăn, ngay cả đối với các mẫu máy trên 1.000 USD. Vì vậy, điều đó có nghĩa là chúng ta không có bất kỳ sự thay thế thực sự nào cho quá trình rasterization?

Các tính năng tiên tiến trong công nghệ đồ họa 3D dành cho người tiêu dùng thường rất tốn kém và hỗ trợ ban đầu cho các khả năng API mới có thể khá chắp vá hoặc chậm (như chúng tôi nhận thấy khi thử nghiệm Max Payne 3 trên một loạt các phiên bản Direct3D vào khoảng năm 2012) – phiên bản thứ hai là thường là do các nhà phát triển trò chơi đang cố gắng đưa vào càng nhiều tính năng nâng cao càng tốt, đôi khi với kinh nghiệm hạn chế về chúng.

Tuy nhiên, khi mà các bộ tạo bóng đỉnh và pixel, tesselation, kết xuất HDR và che phủ không gian xung quanh màn hình từng là những yêu cầu cao, chỉ phù hợp với các GPU cao cấp nhất, thì việc sử dụng chúng giờ đây đã trở nên phổ biến trong các trò chơi và được hỗ trợ bởi nhiều loại cạc đồ họa. Điều này cũng đúng với tính năng dò tia và trong thời gian nhất định, nó sẽ chỉ trở thành một cài đặt chi tiết khác được bật theo mặc định cho hầu hết người dùng.

Và chúng ta đã đi đến phần cuối của phần tìm hiểu sâu thứ hai, nơi chúng ta đã có cái nhìn sâu hơn về thế giới đồ họa 3D. Chúng ta đã xem xét cách các đỉnh của mô hình và thế giới được dịch chuyển ra khỏi không gian 3 chiều và chuyển thành hình ảnh 2D phẳng. Chúng ta đã thấy cách các cài đặt trường nhìn phải được tính đến và chúng tạo ra tác dụng gì. Quá trình biến các đỉnh đó thành pixel đã được khám phá và chúng tôi đã kết thúc bằng một cái nhìn ngắn gọn về một quy trình thay thế cho quá trình tạo điểm ảnh.

Như trước đây, chúng tôi không thể bao trùm hết mọi thứ và chỉ lướt qua một vài chi tiết ở đây và ở đó – xét cho cùng, đây không phải là sách giáo khoa! Nhưng chúng tôi hy vọng bạn đã thu được thêm một chút kiến thức trong quá trình thực hiện và có sự ngưỡng mộ mới dành cho các lập trình viên và kỹ sư, những người đã thực sự thành thạo toán học và khoa học cần thiết để biến tất cả những điều này thành hiện thực trong các tựa game 3D yêu thích của bạn.

Chúng tôi rất sẵn lòng trả lời bất kỳ câu hỏi nào của bạn, vì vậy vui lòng gửi chúng theo cách của chúng tôi trong phần nhận xét. Cho đến cái tiếp theo.

Tín dụng tiêu đề: Tóm tắt raster in đơn sắc của Aleksei Derin