Trong phần đầu tiên này của quá trình tìm hiểu sâu hơn về kết xuất trò chơi 3D, chúng ta sẽ tập trung hoàn toàn vào giai đoạn đỉnh của quy trình. Điều này có nghĩa là lôi sách giáo khoa toán của chúng ta ra, tìm hiểu một chút về đại số tuyến tính, ma trận và lượng giác – ồ đúng rồi!
Chúng ta sẽ tìm hiểu cách các mô hình 3D được biến đổi và cách tính các nguồn sáng. Sự khác biệt giữa trình tạo bóng đỉnh và hình học sẽ được khám phá kỹ lưỡng và bạn sẽ thấy cách sắp xếp lại phù hợp ở đâu. Để giúp giải thích, chúng tôi sẽ sử dụng sơ đồ và ví dụ mã để minh họa cách xử lý toán học và số trong trò chơi . 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 để có cái nhìn cận cảnh đầu tiên về thế giới đồ họa 3D.

Trong thế giới toán học, một điểm chỉ đơn giản là một vị trí trong không gian hình học. Không có gì nhỏ hơn một điểm, vì nó không có kích thước, vì vậy chúng có thể được sử dụng để xác định rõ ràng nơi các đối tượng như đường thẳng, mặt phẳng và khối lượng bắt đầu và kết thúc.
Đối với đồ họa 3D, thông tin này rất quan trọng để thiết lập mọi thứ sẽ trông như thế nào vì mọi thứ được hiển thị là tập hợp các đường thẳng, mặt phẳng, v.v. Hình ảnh bên dưới là ảnh chụp màn hình từ Fallout 4 phát hành năm 2015 của Bethesda:

Có thể hơi khó để nhận ra đây chỉ là một đống lớn các điểm và đường, vì vậy chúng tôi sẽ cho bạn thấy cùng một cảnh trông như thế nào trong chế độ ‘khung dây’. Đặt như thế này, công cụ kết xuất 3D bỏ qua kết cấu và hiệu ứng được thực hiện trong giai đoạn pixel và không vẽ gì ngoài các đường màu nối các điểm lại với nhau.

Bây giờ mọi thứ trông rất khác, nhưng chúng ta có thể thấy tất cả các đường kết hợp với nhau để tạo nên các đối tượng, môi trường và nền khác nhau. Một số chỉ là một vài đường kẻ, chẳng hạn như những tảng đá ở tiền cảnh, trong khi những đường khác có rất nhiều đường khiến chúng có vẻ liền khối.
Mỗi điểm ở đầu và cuối của mỗi dòng đã được xử lý bằng cách thực hiện cả đống phép toán. Một số phép tính này rất nhanh và dễ thực hiện; những người khác là khó khăn hơn nhiều. Có những hiệu suất đạt được đáng kể khi làm việc trên các nhóm điểm cùng nhau, đặc biệt là ở dạng hình tam giác, vì vậy chúng ta hãy bắt đầu xem xét kỹ hơn những điểm này.
Tên tam giác cho chúng ta biết rằng hình có 3 góc bên trong; để có cái này, chúng ta cần 3 góc và 3 đường nối các góc lại với nhau. Tên riêng cho một góc là đỉnh (đỉnh là từ số nhiều) và mỗi đỉnh được mô tả bằng một điểm. Vì chúng tôi dựa trên thế giới hình học 3D, nên chúng tôi sử dụng hệ tọa độ Descartes cho các điểm. Điều này thường được viết dưới dạng 3 giá trị cùng nhau, ví dụ (1, 8, -3) hoặc tổng quát hơn ( x, y, z ).

Từ đây, chúng ta có thể thêm hai đỉnh nữa để có một hình tam giác:

Lưu ý rằng các đường được hiển thị không thực sự cần thiết – chúng ta chỉ cần có các điểm và cho hệ thống biết rằng 3 đỉnh này tạo thành một tam giác. Tất cả dữ liệu đỉnh được lưu trữ trong một khối bộ nhớ liền kề được gọi là bộ đệm đỉnh ; thông tin về hình dạng mà chúng sẽ tạo ra được mã hóa trực tiếp vào chương trình dựng hình hoặc được lưu trữ trong một khối bộ nhớ khác gọi là bộ đệm chỉ mục .
Trong trường hợp trước đây, các hình dạng khác nhau có thể được hình thành từ các đỉnh được gọi là hình nguyên thủy và Direct3D cung cấp danh sách, dải và hình quạt ở dạng điểm, đường và hình tam giác. Được sử dụng đúng cách, các dải tam giác sử dụng các đỉnh cho nhiều tam giác, giúp tăng hiệu suất. Trong ví dụ dưới đây, chúng ta có thể thấy rằng chỉ cần 4 đỉnh để ghép 2 tam giác lại với nhau – nếu chúng tách rời nhau, chúng ta cần 6 đỉnh.

Nếu bạn muốn xử lý một tập hợp các đỉnh lớn hơn, ví dụ như mô hình NPC trong trò chơi, thì tốt nhất bạn nên sử dụng thứ gọi là lưới – đây là một khối bộ nhớ khác nhưng nó bao gồm nhiều bộ đệm (đỉnh, chỉ mục, v.v.) và kết cấu tài nguyên cho mô hình. Microsoft cung cấp phần giới thiệu nhanh về việc sử dụng bộ đệm này trong tài nguyên tài liệu trực tuyến của họ.
Hiện tại, hãy tập trung vào những gì được thực hiện với các đỉnh này trong trò chơi 3D, mỗi khi một khung hình mới được hiển thị (nếu bạn không chắc điều đó có nghĩa là gì, hãy quét nhanh lại 101 kết xuất của chúng tôi). Nói một cách đơn giản, một hoặc hai điều đã được thực hiện với họ:
Sẵn sàng cho một số toán học? Tốt! Bởi vì đây là cách những điều này được thực hiện.
Hãy tưởng tượng bạn có một hình tam giác trên màn hình và bạn nhấn một phím để di chuyển nó sang trái. Đương nhiên, bạn sẽ mong đợi các số ( x, y, z ) cho mỗi đỉnh thay đổi tương ứng và đúng như vậy; tuy nhiên, làm thế nào điều này được thực hiện có vẻ hơi bất thường. Thay vì chỉ thay đổi tọa độ, phần lớn các hệ thống kết xuất đồ họa 3D sử dụng một công cụ toán học cụ thể để hoàn thành công việc: chúng ta đang nói về vectơ .
Một vectơ có thể được coi là một mũi tên hướng tới một vị trí cụ thể trong không gian và có thể có độ dài bất kỳ theo yêu cầu. Các đỉnh thực sự được mô tả bằng cách sử dụng các vectơ, dựa trên tọa độ Descartes, theo cách này:

Lưu ý cách mũi tên màu xanh bắt đầu tại một vị trí (trong trường hợp này là gốc tọa độ ) và kéo dài đến đỉnh. Chúng tôi đã sử dụng cái gọi là ký hiệu cột c để mô tả vectơ này, nhưng ký hiệu hàng cũng hoạt động tốt. Bạn sẽ phát hiện ra rằng cũng có một giá trị bổ sung – số thứ 4 thường được gắn nhãn là thành phần w và nó được sử dụng để cho biết liệu vectơ có đang được sử dụng để mô tả vị trí của một đỉnh hay không (được gọi là vectơ vị trí ) hoặc mô tả một hướng chung (một vectơ chỉ phương ). Trong trường hợp sau, nó sẽ trông như thế này:

Vectơ này chỉ cùng hướng và có cùng độ dài với vectơ vị trí trước đó, vì vậy các giá trị ( x, y, z ) sẽ giống nhau; tuy nhiên, thành phần w- bằng 0, thay vì 1. Việc sử dụng các vectơ chỉ hướng sẽ trở nên rõ ràng ở phần sau của bài viết này nhưng hiện tại, chúng ta hãy lưu ý rằng tất cả các đỉnh trong cảnh 3D sẽ được mô tả như thế này đường. Tại sao? Bởi vì ở định dạng này, việc bắt đầu di chuyển chúng trở nên dễ dàng hơn rất nhiều.
Hãy nhớ rằng chúng ta có một hình tam giác cơ bản và chúng ta muốn di chuyển nó sang bên trái. Mỗi đỉnh được mô tả bởi một vectơ vị trí, vì vậy ‘toán chuyển động’ mà chúng ta cần thực hiện (được gọi là các phép biến đổi ) phải hoạt động trên các vectơ này. Nhập công cụ tiếp theo: ma trận (hoặc ma trận cho một trong số chúng). Đây là một mảng các giá trị được viết hơi giống bảng tính Excel, theo hàng và cột.
Đối với mỗi loại phép biến đổi mà chúng ta muốn thực hiện, có một ma trận liên quan đi kèm với nó, và nó chỉ đơn giản là trường hợp nhân ma trận biến đổi và vectơ vị trí với nhau. Chúng ta sẽ không xem xét các chi tiết cụ thể về cách thức và lý do điều này xảy ra, nhưng chúng ta có thể thấy nó trông như thế nào.
Di chuyển một đỉnh trong không gian 3D được gọi là phép tịnh tiến và phép tính cần thiết là:

Các giá trị x 0 , v.v. đại diện cho tọa độ ban đầu của đỉnh; các giá trị delta – x biểu thị số lượng đỉnh cần được di chuyển. Phép tính vectơ-ma trận dẫn đến việc cả hai được cộng lại với nhau một cách đơn giản (lưu ý rằng thành phần w vẫn chưa được xử lý, vì vậy câu trả lời cuối cùng vẫn là một vectơ vị trí).
Cũng như di chuyển mọi thứ xung quanh, chúng ta có thể muốn xoay hình tam giác hoặc thu nhỏ kích thước của nó lớn hơn hoặc nhỏ hơn – có các phép biến đổi cho cả hai điều này.


Chúng ta có thể sử dụng công cụ đồ họa do WebGL cung cấp tại trang web Kết xuất thời gian thực để trực quan hóa các tính toán này trên toàn bộ hình dạng. Hãy bắt đầu với một hình khối ở vị trí mặc định:

Trong công cụ trực tuyến này, điểm mô hình đề cập đến vectơ vị trí, ma trận thế giới là ma trận chuyển đổi và điểm không gian thế giới là vectơ vị trí cho đỉnh được chuyển đổi.
Bây giờ, hãy áp dụng nhiều phép biến đổi khác nhau cho hình khối:

Trong hình trên, hình đã được dịch 5 đơn vị theo mọi hướng. Chúng ta có thể thấy những giá trị này trong ma trận lớn ở giữa, trong cột cuối cùng. Vectơ vị trí ban đầu (4, 5, 3, 1) vẫn giữ nguyên, nhưng đỉnh được biến đổi hiện đã được dịch thành (9, 10, 8, 1).

Trong phép biến đổi này, mọi thứ đã được thu nhỏ theo hệ số 2: hình khối bây giờ có các cạnh dài gấp đôi. Ví dụ cuối cùng để xem xét là một điểm xoay:

Hình khối đã được xoay qua một góc 45° nhưng ma trận đang sử dụng sin và cosin của góc đó. Kiểm tra nhanh trên bất kỳ máy tính khoa học nào sẽ cho chúng ta thấy rằng sin(45°) = 0,7071… làm tròn giá trị 0,71 được hiển thị. Chúng tôi nhận được câu trả lời tương tự cho giá trị cosine .
Ma trận và vectơ không phải được sử dụng; một giải pháp thay thế phổ biến, đặc biệt là để xử lý các phép quay phức tạp, liên quan đến việc sử dụng các số phức và bậc bốn. Phép toán này là một bước tiến đáng kể từ vectơ, vì vậy chúng ta sẽ chuyển sang phép biến đổi.
Ở giai đoạn này, chúng ta nên lưu ý rằng tất cả những điều này cần được tìm ra bởi những người lập trình mã kết xuất. Nếu một nhà phát triển trò chơi đang sử dụng một công cụ của bên thứ ba (chẳng hạn như Unity hoặc Unreal), thì điều này đã được thực hiện cho họ, nhưng bất kỳ ai tự làm từ đầu sẽ cần phải tìm ra những tính toán cần thực hiện để đỉnh nào.
Nhưng điều này trông như thế nào, về mặt mã?
Để giải quyết vấn đề này, chúng tôi sẽ sử dụng các ví dụ từ trang web tuyệt vời Braynzar Soft. Nếu bạn muốn tự mình bắt đầu lập trình 3D, đây là một nơi tuyệt vời để tìm hiểu những kiến thức cơ bản cũng như một số nội dung nâng cao hơn…

Ví dụ này là một ‘chuyển đổi tất cả trong một’. Nó tạo ra các ma trận biến đổi tương ứng dựa trên đầu vào bàn phím, sau đó áp dụng nó vào vectơ vị trí ban đầu trong một thao tác. Lưu ý rằng điều này luôn được thực hiện theo thứ tự đã đặt (tỷ lệ – xoay – dịch), vì bất kỳ cách nào khác sẽ hoàn toàn làm hỏng kết quả.
Những khối mã như vậy được gọi là vertex shader và chúng có thể thay đổi rất nhiều về chức năng, kích thước và độ phức tạp của chúng. Ví dụ trên là cơ bản như chúng xuất hiện và được cho là chỉ là một trình tạo bóng đỉnh, vì nó không sử dụng bản chất có thể lập trình đầy đủ của các trình tạo bóng. Một chuỗi trình tạo bóng phức tạp hơn có thể sẽ chuyển đổi nó trong không gian 3D, tìm ra cách tất cả sẽ xuất hiện trước máy ảnh của cảnh, sau đó chuyển dữ liệu đó sang giai đoạn tiếp theo trong quy trình kết xuất. Chúng ta sẽ xem xét thêm một số ví dụ khi thực hiện trình tự xử lý đỉnh.
Tất nhiên, chúng có thể được sử dụng cho nhiều mục đích hơn nữa và mỗi khi bạn chơi trò chơi được hiển thị ở chế độ 3D, chỉ cần nhớ rằng tất cả chuyển động bạn có thể thấy đều do bộ xử lý đồ họa xử lý, theo hướng dẫn trong trình đổ bóng đỉnh.
Tuy nhiên, điều này không phải lúc nào cũng đúng. Nếu chúng ta quay ngược thời gian về giữa đến cuối những năm 1990, các card đồ họa của thời đại đó không có khả năng tự xử lý các đỉnh và nguyên hàm, tất cả điều này được thực hiện hoàn toàn trên CPU.

Một trong những bộ xử lý đầu tiên cung cấp khả năng tăng tốc phần cứng chuyên dụng cho loại quy trình này là GeForce ban đầu của Nvidia được phát hành vào năm 2000 và khả năng này được gắn nhãn là Chuyển đổi phần cứng và chiếu sáng (hoặc viết tắt là TnL phần cứng). Các quy trình mà phần cứng này có thể xử lý rất cứng nhắc và cố định về mặt lệnh, nhưng điều này nhanh chóng thay đổi khi các chip đồ họa mới hơn được phát hành. Ngày nay, không có phần cứng riêng biệt để xử lý đỉnh và các đơn vị tương tự xử lý mọi thứ: điểm, nguyên hàm, pixel, kết cấu, v.v.
Nói về ánh sáng , điều đáng chú ý là tất cả mọi thứ chúng ta nhìn thấy đều do ánh sáng, vì vậy hãy xem cách xử lý vấn đề này ở giai đoạn đỉnh. Để làm điều này, chúng tôi sẽ sử dụng một cái gì đó mà chúng tôi đã đề cập trước đó trong bài viết này.
Hãy hình dung cảnh này: người chơi đứng trong một căn phòng tối, được thắp sáng bởi một nguồn sáng duy nhất ở bên phải. Ở giữa phòng, có một ấm trà khổng lồ, nổi, đục ngầu. Được rồi, vì vậy có lẽ chúng ta sẽ cần một chút trợ giúp để hình dung điều này, vì vậy hãy sử dụng trang web Kết xuất thời gian thực để xem một số thứ như thế này đang hoạt động:

Bây giờ, đừng quên rằng đối tượng này là một tập hợp các hình tam giác phẳng được ghép lại với nhau; điều này có nghĩa là mặt phẳng của mỗi tam giác sẽ hướng về một hướng cụ thể. Một số hướng về phía máy ảnh, một số hướng về phía khác và một số khác bị lệch. Ánh sáng từ nguồn sẽ chiếu vào từng mặt phẳng và dội ra một góc nhất định.
Tùy thuộc vào nơi ánh sáng chiếu tới, màu sắc và độ sáng của mặt phẳng sẽ khác nhau và để đảm bảo rằng màu sắc của vật thể trông chính xác, tất cả điều này cần được tính toán và giải thích.
Để bắt đầu, chúng ta cần biết mặt phẳng hướng về phía nào và để làm được điều đó, chúng ta cần vectơ pháp tuyến của mặt phẳng . Đây là một mũi tên khác nhưng không giống như vectơ vị trí, kích thước của nó không thành vấn đề (thực tế, chúng luôn được thu nhỏ lại sau khi tính toán, sao cho chúng có chiều dài chính xác là 1 đơn vị) và nó luôn vuông góc (ở một góc vuông) với máy bay.

Pháp tuyến của mỗi mặt phẳng tam giác được tính bằng cách tính tích vectơ của hai vectơ chỉ phương ( p và q được hiển thị ở trên) tạo thành các cạnh của tam giác. Thực sự tốt hơn là tính toán nó cho từng đỉnh, thay vì cho từng tam giác riêng lẻ, nhưng với điều kiện là sẽ luôn có nhiều cái trước hơn so với cái sau, sẽ nhanh hơn nếu chỉ làm điều đó cho các hình tam giác.
Khi bạn có bề mặt bình thường, bạn có thể bắt đầu tính đến nguồn sáng và máy ảnh. Đèn có thể có nhiều loại khác nhau trong kết xuất 3D nhưng với mục đích của bài viết này, chúng tôi sẽ chỉ xem xét đèn định hướng , ví dụ như đèn chiếu. Giống như mặt phẳng của một hình tam giác, đèn chiếu và máy ảnh sẽ hướng về một hướng cụ thể, có thể giống như thế này:

Vectơ của ánh sáng và vectơ pháp tuyến có thể được sử dụng để tìm ra góc mà ánh sáng chiếu vào bề mặt (sử dụng mối quan hệ giữa tích vô hướng của các vectơ và tích của các kích thước của chúng). Các đỉnh của hình tam giác sẽ mang thông tin bổ sung về màu sắc và chất liệu của chúng – trong trường hợp của hình tam giác, nó sẽ mô tả điều gì xảy ra với ánh sáng khi nó chạm vào bề mặt.
Một bề mặt kim loại, nhẵn sẽ phản xạ gần như toàn bộ ánh sáng tới ở cùng một góc mà nó chiếu vào và sẽ hầu như không thay đổi màu sắc. Ngược lại, vật liệu thô ráp, xỉn màu sẽ phân tán ánh sáng theo cách khó dự đoán hơn và thay đổi màu sắc một cách tinh vi. Để giải thích cho điều này, các đỉnh cần phải có các giá trị bổ sung:
Các mô hình chiếu sáng khác nhau sẽ sử dụng các công thức toán học khác nhau để nhóm tất cả những thứ này lại với nhau và phép tính tạo ra một vectơ cho ánh sáng đi ra. Điều này được kết hợp với vectơ của máy ảnh, hình dạng tổng thể của hình tam giác có thể được xác định.

Chúng tôi đã bỏ qua nhiều chi tiết tốt hơn ở đây và vì lý do chính đáng: hãy lấy bất kỳ cuốn sách giáo khoa nào về kết xuất 3D và bạn sẽ thấy toàn bộ các chương dành riêng cho quy trình đơn lẻ này. Tuy nhiên, các trò chơi hiện đại thường thực hiện phần lớn các phép tính ánh sáng và hiệu ứng vật chất trong giai đoạn xử lý pixel, vì vậy chúng tôi sẽ xem lại chủ đề này trong một bài viết khác.

Tất cả những gì chúng tôi đã trình bày cho đến nay đều được thực hiện bằng cách sử dụng các trình tạo bóng đỉnh và có vẻ như hầu như không có gì chúng không thể làm được; thật không may, có. Trình tạo bóng đỉnh không thể tạo các đỉnh mới và mỗi trình tạo bóng phải hoạt động trên từng đỉnh đơn lẻ. Sẽ rất hữu ích nếu có một số cách sử dụng một chút mã để tạo nhiều hình tam giác hơn, ở giữa những hình chúng ta đã có (để cải thiện chất lượng hình ảnh) và có một trình đổ bóng hoạt động trên toàn bộ nguyên thủy (để tăng tốc mọi thứ hướng lên). Chà, với bộ xử lý đồ họa hiện đại, chúng ta có thể làm được điều này!
Chip đồ họa mới nhất vô cùng mạnh mẽ, có khả năng thực hiện hàng triệu phép tính ma trận-vector mỗi giây; chúng có khả năng dễ dàng cung cấp năng lượng thông qua một đống đỉnh khổng lồ ngay lập tức. Mặt khác, rất tốn thời gian để tạo ra các mô hình có độ chi tiết cao để kết xuất và nếu mô hình sẽ ở một khoảng cách xa trong cảnh, thì tất cả các chi tiết bổ sung đó sẽ bị lãng phí.
Cái chúng ta cần là một cách để yêu cầu bộ xử lý chia nhỏ một hình nguyên thủy lớn hơn, chẳng hạn như hình tam giác phẳng duy nhất mà chúng ta đang xem xét, thành một tập hợp các hình tam giác nhỏ hơn, tất cả được liên kết bên trong hình lớn ban đầu. Tên của quá trình này là tesselation và các chip đồ họa đã có thể thực hiện điều này từ lâu; điều đã được cải thiện trong những năm qua là số lượng các lập trình viên kiểm soát đối với hoạt động.
Để thấy được điều này trong thực tế, chúng tôi sẽ sử dụng công cụ điểm chuẩn Heaven của Unigine, vì nó cho phép chúng tôi áp dụng các lượng tessellation khác nhau cho các mô hình cụ thể được sử dụng trong thử nghiệm.

Để bắt đầu, hãy chọn một vị trí trong điểm chuẩn và kiểm tra mà không áp dụng tessname. Lưu ý cách những viên sỏi trên mặt đất trông rất giả tạo – kết cấu được sử dụng có hiệu quả nhưng nó trông không ổn. Hãy áp dụng một số tessellation cho cảnh này; công cụ Unigine chỉ áp dụng nó cho một số bộ phận nhất định nhưng sự khác biệt là rất lớn.

Mặt đất, các cạnh của tòa nhà và ô cửa giờ đây trông thực tế hơn rất nhiều. Chúng ta có thể thấy điều này đã đạt được như thế nào nếu chúng ta chạy lại quy trình, nhưng lần này với các cạnh của nguyên thủy đều được tô sáng (hay còn gọi là chế độ khung dây):

Chúng ta có thể thấy rõ tại sao mặt đất trông rất kỳ lạ – nó hoàn toàn bằng phẳng! Ô cửa cũng bằng phẳng với các bức tường, và các cạnh của tòa nhà không có gì khác hơn là những hình khối đơn giản.
Trong Direct3D, các nguyên mẫu có thể được chia thành một nhóm các phần nhỏ hơn (một quy trình được gọi là phân chia phụ ) bằng cách chạy trình tự 3 giai đoạn. Đầu tiên, các lập trình viên viết một bộ đổ bóng thân tàu – về cơ bản, đoạn mã này tạo ra một thứ gọi là bản vá hình học . Hãy coi đây là một bản đồ cho bộ xử lý biết các điểm và đường mới sẽ xuất hiện bên trong nguyên mẫu ban đầu.
Sau đó, đơn vị tesselator bên trong bộ xử lý đồ họa sẽ áp dụng bản vá cho nguyên thủy. Cuối cùng, một trình đổ bóng miền được chạy, tính toán vị trí của tất cả các đỉnh mới. Dữ liệu này có thể được đưa trở lại bộ đệm đỉnh, nếu cần, để có thể thực hiện lại các phép tính ánh sáng, nhưng lần này với kết quả tốt hơn.
Vì vậy, điều này trông như thế nào? Hãy kích hoạt phiên bản khung dây của cảnh được xếp chồng lên nhau:

Sự thật mà nói, chúng tôi đặt mức độ tessellation ở mức khá cao, để hỗ trợ giải thích quy trình. Dù chip đồ họa hiện đại có tốt đến đâu, đó không phải là điều bạn muốn làm trong mọi trò chơi – chẳng hạn như lấy cột đèn gần cửa ra vào.
Trong các hình ảnh không có khung dây, bạn sẽ buộc phải nhận ra sự khác biệt ở khoảng cách này và bạn có thể thấy rằng mức độ xếp chồng này đã chồng chất lên rất nhiều hình tam giác phụ, thật khó để tách một số trong số chúng ra. Tuy nhiên, được sử dụng một cách thích hợp và chức năng xử lý đỉnh này có thể tạo ra một số hiệu ứng hình ảnh tuyệt vời, đặc biệt là khi cố gắng mô phỏng các va chạm của vật thể mềm.
Trong các hình ảnh không có khung dây, bạn sẽ buộc phải nhận ra sự khác biệt ở khoảng cách này và bạn có thể thấy rằng mức độ xếp chồng này đã chồng chất lên rất nhiều hình tam giác phụ, thật khó để tách một số trong số chúng ra. Chúng ta hãy xem điều này có thể trông như thế nào, về mặt mã Direct3D; để làm điều này, chúng tôi sẽ sử dụng một ví dụ từ một trang web tuyệt vời khác RasterTek.
Ở đây, một hình tam giác màu xanh lục được xếp thành nhiều hình tam giác nhỏ hơn…

Quá trình xử lý đỉnh được thực hiện thông qua 3 trình tạo bóng riêng biệt (xem ví dụ mã): một trình tạo bóng đỉnh để thiết lập tam giác sẵn sàng cho việc xếp chồng, một trình tạo bóng thân tàu để tạo bản vá và một trình tạo bóng miền để xử lý các đỉnh mới. Kết quả của việc này rất đơn giản nhưng ví dụ về Unigine làm nổi bật cả lợi ích và nguy cơ tiềm ẩn của việc sử dụng tessellation ở mọi nơi. Tuy nhiên, được sử dụng một cách thích hợp và chức năng xử lý đỉnh này có thể tạo ra một số hiệu ứng hình ảnh tuyệt vời, đặc biệt là khi cố gắng mô phỏng các va chạm của vật thể mềm.
Hãy nhớ điểm về trình tạo bóng đỉnh và chúng luôn chạy trên mọi đỉnh đơn lẻ trong cảnh? Không khó để nhận ra cách mà tessellation có thể khiến vấn đề này trở thành một vấn đề thực sự. Và có rất nhiều hiệu ứng hình ảnh mà bạn muốn xử lý nhiều phiên bản của cùng một nguyên mẫu, nhưng không muốn tạo nhiều chúng ngay từ đầu; tóc, lông thú, cỏ và các hạt phát nổ đều là những ví dụ điển hình về điều này.
May mắn thay, có một shader khác chỉ dành cho những thứ như vậy – shader hình học . Đây là một phiên bản hạn chế hơn của trình đổ bóng đỉnh, nhưng có thể được áp dụng cho toàn bộ nguyên thủy và kết hợp với tessname, giúp lập trình viên kiểm soát tốt hơn đối với các nhóm lớn các đỉnh.

Direct3D, giống như tất cả các API đồ họa hiện đại, cho phép thực hiện một loạt các tính toán trên các đỉnh. Dữ liệu đã hoàn thiện có thể được gửi đến giai đoạn tiếp theo trong quy trình kết xuất ( rasterization ) hoặc được đưa trở lại nhóm bộ nhớ để CPU có thể xử lý lại hoặc đọc cho các mục đích khác. Điều này có thể được thực hiện dưới dạng luồng dữ liệu, như được đánh dấu trong tài liệu Direct3D của Microsoft:

Giai đoạn đầu ra luồng không bắt buộc, đặc biệt là vì nó chỉ có thể cung cấp toàn bộ nguyên thủy (chứ không phải từng đỉnh riêng lẻ) qua vòng kết xuất, nhưng nó hữu ích cho các hiệu ứng liên quan đến nhiều hạt ở khắp mọi nơi. Thủ thuật tương tự có thể được thực hiện bằng cách sử dụng bộ đệm đỉnh động hoặc có thể thay đổi, nhưng tốt hơn hết là giữ cố định bộ đệm đầu vào vì có hiệu suất bị ảnh hưởng nếu chúng cần được ‘mở ra’ để thay đổi.
Xử lý đỉnh là một phần quan trọng để kết xuất, vì nó xác định cách sắp xếp cảnh từ phối cảnh của máy ảnh. Các trò chơi hiện đại có thể sử dụng hàng triệu hình tam giác để tạo ra thế giới của chúng và mỗi đỉnh trong số đó sẽ được biến đổi và thắp sáng theo một cách nào đó.

Xử lý tất cả toán học và dữ liệu này có vẻ giống như một cơn ác mộng về hậu cần, nhưng bộ xử lý đồ họa (GPU) và API được thiết kế với tất cả những điều này – hình dung một nhà máy đang vận hành trơn tru, sản xuất từng sản phẩm một qua một chuỗi các giai đoạn sản xuất, và bạn sẽ có một cảm giác tốt về nó.
Các lập trình viên kết xuất trò chơi 3D có kinh nghiệm có nền tảng vững chắc về toán học và vật lý nâng cao; họ sử dụng mọi thủ thuật và công cụ trong giao dịch để tối ưu hóa các hoạt động, thu gọn giai đoạn xử lý đỉnh xuống chỉ còn vài mili giây. Và đó mới chỉ là phần bắt đầu tạo khung 3D – tiếp theo là giai đoạn rasterization, sau đó là quá trình xử lý kết cấu và pixel cực kỳ phức tạp, trước khi nó đến gần màn hình của bạn.
Bây giờ bạn đã đọc đến cuối bài viết này, chúng tôi hy vọng bạn đã hiểu rõ hơn về hành trình của một đỉnh khi nó được xử lý cho khung 3D. Chúng tôi không đề cập đến mọi thứ (đó sẽ là một bài báo khổng lồ !) và chúng tôi chắc chắn rằng bạn sẽ có nhiều câu hỏi về vectơ, ma trận, ánh sáng và nguyên hàm. Hãy giải quyết chúng theo cách của chúng tôi trong phần bình luận và chúng tôi sẽ cố gắng hết sức để trả lời tất cả.