Bạn đang chơi Call of Mario: Death Duty Battleyard mới nhất trên PC chơi game hoàn hảo của mình. Bạn đang xem một màn hình siêu rộng 4K tuyệt đẹp, chiêm ngưỡng khung cảnh rực rỡ và chi tiết phức tạp. Bạn đã bao giờ tự hỏi làm thế nào những đồ họa đó có được ở đó chưa? Tò mò muốn biết trò chơi đã khiến PC của bạn làm gì để tạo ra chúng?
Chào mừng bạn đến với phần 101 trong kết xuất trò chơi 3D của chúng tôi: hướng dẫn dành cho người mới bắt đầu về cách tạo một khung hình cơ bản về tính tốt của trò chơi.

Mỗi năm, hàng trăm trò chơi mới được phát hành trên toàn cầu – một số được thiết kế cho điện thoại di động, một số dành cho bảng điều khiển, một số dành cho PC. Phạm vi định dạng và thể loại được đề cập cũng toàn diện, nhưng có một loại có thể được các nhà phát triển trò chơi khám phá nhiều hơn bất kỳ loại nào khác: 3D. Lần đầu tiên về ilk của nó có phần mở ra để tranh luận và việc quét nhanh cơ sở dữ liệu của Kỷ lục Guinness Thế giới sẽ tạo ra nhiều câu trả lời khác nhau. Chúng ta có thể chọn Knight Lore by Ultimate, ra mắt năm 1984, như một phần khởi đầu xứng đáng nhưng những hình ảnh được tạo ra trong trò chơi đó hoàn toàn là 2D – không có phần thông tin nào được sử dụng thực sự là 3 chiều.
Vì vậy, nếu chúng ta muốn hiểu cách một trò chơi 3D ngày nay tạo ra hình ảnh của nó, chúng ta cần một ví dụ khởi đầu khác: Win Run của Namco, khoảng năm 1988. Đây có lẽ là trò chơi đầu tiên thuộc loại này giải quyết mọi thứ trong không gian 3 chiều từ bắt đầu, sử dụng các kỹ thuật không khác xa hàng triệu dặm so với những gì đang diễn ra hiện nay. Tất nhiên, bất kỳ trò chơi nào trên 30 tuổi sẽ không thực sự giống như Codemaster’s F1 2018, nhưng sơ đồ cơ bản để thực hiện tất cả không khác biệt nhiều.

Trong bài viết này, chúng ta sẽ tìm hiểu quy trình mà trò chơi 3D cần để tạo ra hình ảnh cơ bản cho màn hình hoặc TV hiển thị. Chúng ta sẽ bắt đầu với kết quả cuối cùng và tự hỏi: “tôi đang xem cái gì?”
Từ đó, chúng tôi sẽ phân tích từng bước được thực hiện để có được bức ảnh mà chúng tôi thấy. Đồng thời, chúng tôi sẽ đề cập đến những thứ nhỏ gọn như đỉnh và pixel, kết cấu và đường chuyền, bộ đệm và bóng đổ, cũng như phần mềm và hướng dẫn. Chúng ta cũng sẽ xem card đồ họa phù hợp với tất cả những thứ này ở đâu và tại sao nó lại cần thiết. Với 101 này, bạn sẽ nhìn trò chơi và PC của mình dưới một ánh sáng mới và đánh giá cao những đồ họa đó với một chút ngưỡng mộ hơn.
Hãy khởi động một trò chơi 3D, để chúng ta có thứ gì đó bắt đầu, và không vì lý do gì khác ngoài việc đây có lẽ là trò chơi đáng nhớ nhất mọi thời đại, chúng ta sẽ sử dụng Crysis phát hành năm 2007 của Crytek. Trong hình ảnh bên dưới, chúng tôi đang xem ảnh chụp từ camera của màn hình hiển thị trò chơi.

Bức tranh này thường được gọi là khung , nhưng chính xác thì chúng ta đang nhìn vào cái gì? Chà, bằng cách sử dụng máy ảnh có ống kính macro, thay vì ảnh chụp màn hình trong trò chơi, chúng tôi có thể tạo một điểm CSI: TechSpot và yêu cầu ai đó nâng cấp nó!

Thật không may, ánh sáng chói và ánh sáng nền của màn hình đang cản trở chi tiết hình ảnh, nhưng nếu chúng tôi cải thiện nó thêm một chút nữa…

Chúng ta có thể thấy rằng khung trên màn hình được tạo thành từ một lưới các phần tử có màu riêng lẻ và nếu chúng ta nhìn thật gần, bản thân các khối này được tạo từ 3 bit nhỏ hơn. Mỗi bộ ba được gọi là một pixel (viết tắt của phần tử hình ảnh) và phần lớn màn hình vẽ chúng bằng ba màu: đỏ, lục và lam (còn gọi là RGB). Đối với mỗi khung hình mới được màn hình hiển thị, một danh sách hàng nghìn, nếu không muốn nói là hàng triệu giá trị RGB cần được xử lý và lưu trữ trong một phần bộ nhớ mà màn hình có thể truy cập. Những khối bộ nhớ như vậy được gọi là bộ đệm , do đó, một cách tự nhiên, màn hình được cung cấp nội dung của một thứ được gọi là bộ đệm khung .
Đó thực sự là điểm kết thúc mà chúng ta đang bắt đầu, vì vậy bây giờ chúng ta cần bắt đầu từ đầu và trải qua quá trình để đạt được điều đó. Cái tên rendering thường được sử dụng để mô tả điều này nhưng thực tế nó là một danh sách dài các giai đoạn được liên kết nhưng riêng biệt, hoàn toàn khác nhau về những gì xảy ra. Hãy nghĩ về nó giống như việc trở thành một đầu bếp và chế biến một bữa ăn xứng đáng với nhà hàng đạt sao Michelin: kết quả cuối cùng là một đĩa thức ăn ngon, nhưng bạn cần phải hoàn thành nhiều việc trước khi có thể thưởng thức. Và cũng giống như nấu ăn, nhu cầu dựng hình một số thành phần cơ bản.
Các khối xây dựng cơ bản cho bất kỳ trò chơi 3D nào là tài sản trực quan sẽ tạo nên thế giới được kết xuất. Phim ảnh, chương trình truyền hình, tác phẩm sân khấu và những thứ tương tự, tất cả đều cần diễn viên, trang phục, đạo cụ, phông nền, ánh sáng – danh sách này khá dài. Trò chơi 3D không có gì khác biệt và mọi thứ nhìn thấy trong khung hình được tạo sẽ do các nghệ sĩ và nhà tạo mẫu thiết kế. Để giúp hình dung điều này, chúng ta hãy đi học cũ và xem một mô hình từ Quake II củaSoftware:

Ra mắt hơn 20 năm trước, Quake II là một bước đột phá về công nghệ, mặc dù công bằng mà nói, giống như bất kỳ trò chơi 3D nào đã tồn tại hai thập kỷ, các mô hình trông hơi khối. Nhưng điều này cho phép chúng tôi dễ dàng biết được tài sản này được làm từ gì.

Trong hình ảnh đầu tiên, chúng ta có thể thấy rằng chunky fella được xây dựng từ các hình tam giác được kết nối – các góc của mỗi hình được gọi là đỉnh hoặc đỉnh của một trong số chúng. Mỗi đỉnh hoạt động như một điểm trong không gian, do đó sẽ có ít nhất 3 số để mô tả nó, đó là tọa độ x,y,z . Tuy nhiên, một trò chơi 3D cần nhiều hơn thế và mỗi đỉnh sẽ có một số giá trị bổ sung, chẳng hạn như màu của đỉnh, hướng mà nó hướng tới (vâng, các điểm không thể thực sự đối diện với bất kỳ đâu… chỉ cần lăn theo nó! ), độ bóng của nó như thế nào, có trong mờ hay không, v.v.

Một bộ giá trị cụ thể mà các đỉnh luôn có là liên quan đến bản đồ kết cấu . Đây là hình ảnh về ‘quần áo’ mà người mẫu phải mặc, nhưng vì nó là hình ảnh phẳng nên bản đồ phải chứa chế độ xem cho mọi hướng có thể mà chúng ta có thể nhìn vào người mẫu từ đó. Trong ví dụ Quake II của chúng ta, chúng ta có thể thấy rằng đó chỉ là một cách tiếp cận khá cơ bản: trước, sau và hai bên (của cánh tay). Một trò chơi 3D hiện đại thực sự sẽ có nhiều bản đồ kết cấu cho các mô hình, mỗi bản đồ được đóng gói đầy đủ chi tiết, không có khoảng trống lãng phí nào trong đó; một số bản đồ sẽ không giống như vật liệu hoặc tính năng mà thay vào đó cung cấp thông tin về cách ánh sáng sẽ bật ra khỏi bề mặt. Mỗi đỉnh sẽ có một bộ tọa độ trong bản đồ kết cấu được liên kết của mô hình để có thể ‘khâu’ nó trên đỉnh – điều này có nghĩa là nếu đỉnh đã từng di chuyển thì kết cấu sẽ di chuyển theo nó.
Vì vậy, trong thế giới kết xuất 3D, mọi thứ được nhìn thấy sẽ bắt đầu dưới dạng tập hợp các đỉnh và bản đồ kết cấu. Chúng được đối chiếu vào bộ nhớ đệm liên kết với nhau – bộ đệm đỉnh chứa thông tin về các đỉnh; một bộ đệm chỉ mục cho chúng ta biết cách các đỉnh kết nối để tạo thành các hình dạng; một bộ đệm tài nguyên chứa các kết cấu và các phần của bộ nhớ được đặt sang một bên để sử dụng sau này trong quá trình kết xuất; một lệnh đệm danh sách các hướng dẫn về những việc cần làm với tất cả.
Tất cả điều này tạo thành khung bắt buộc sẽ được sử dụng để tạo lưới pixel màu cuối cùng. Đối với một số trò chơi, đó có thể là một lượng dữ liệu khổng lồ vì sẽ rất chậm để tạo lại bộ đệm cho mỗi khung hình mới. Trò chơi hoặc lưu trữ tất cả thông tin cần thiết, để tạo thành toàn bộ thế giới có khả năng được xem, trong bộ đệm hoặc lưu trữ đủ để bao quát nhiều chế độ xem, sau đó cập nhật thông tin đó theo yêu cầu. Ví dụ: trò chơi đua xe như F1 2018 sẽ có mọi thứ trong một bộ sưu tập bộ đệm lớn, trong khi trò chơi thế giới mở, chẳng hạn như Skyrim của Bethesda, sẽ di chuyển dữ liệu vào và ra khỏi bộ đệm khi máy ảnh di chuyển khắp thế giới.
Với tất cả các thông tin trực quan trong tay, một trò chơi sau đó sẽ bắt đầu quá trình để hiển thị thông tin đó một cách trực quan. Để bắt đầu, cảnh bắt đầu ở vị trí mặc định, với các mô hình, đèn, v.v., tất cả đều được định vị theo cách cơ bản. Đây sẽ là khung hình ‘không’ – điểm bắt đầu của đồ họa và thường không được hiển thị, chỉ được xử lý để mọi thứ diễn ra. Để giúp chứng minh những gì đang diễn ra với giai đoạn đầu tiên của quy trình kết xuất, chúng tôi sẽ sử dụng một công cụ trực tuyến tại trang web Kết xuất thời gian thực. Hãy bắt đầu với một ‘trò chơi’ rất cơ bản: một hình khối trên mặt đất.

Hình dạng cụ thể này chứa 8 đỉnh, mỗi đỉnh được mô tả thông qua một danh sách các số và giữa chúng tạo thành một mô hình bao gồm 12 hình tam giác. Một hình tam giác hoặc thậm chí toàn bộ một đối tượng được gọi là nguyên thủy . Khi các giá trị nguyên thủy này được di chuyển, xoay và chia tỷ lệ, các số được chạy qua một chuỗi các phép toán và cập nhật tương ứng.

Lưu ý rằng số điểm của mô hình không thay đổi, chỉ là các giá trị cho biết vị trí của nó trên thế giới. Việc đề cập đến toán học liên quan nằm ngoài phạm vi của 101 này, nhưng phần quan trọng của quá trình này là tất cả về việc di chuyển mọi thứ đến nơi cần đến đầu tiên. Sau đó, đã đến lúc tô màu.

Hãy sử dụng một mô hình khác, với số đỉnh gấp hơn 10 lần so với hình khối trước đó. Loại xử lý màu cơ bản nhất lấy màu của từng đỉnh và sau đó tính toán bề mặt của bề mặt thay đổi như thế nào giữa chúng; điều này được gọi là phép nội suy .

Có nhiều đỉnh hơn trong một mô hình không chỉ giúp có nội dung thực tế hơn mà còn tạo ra kết quả tốt hơn với phép nội suy màu.

Trong giai đoạn này của trình tự kết xuất, hiệu ứng của ánh sáng trong cảnh có thể được khám phá chi tiết; ví dụ, cách vật liệu của mô hình phản chiếu ánh sáng, có thể được giới thiệu. Những tính toán như vậy cần tính đến vị trí và hướng của camera quan sát thế giới, cũng như vị trí và hướng của đèn.

Có rất nhiều kỹ thuật toán học khác nhau có thể được sử dụng ở đây; một số đơn giản, một số rất phức tạp. Trong hình trên, chúng ta có thể thấy rằng quy trình bên phải tạo ra kết quả trông đẹp hơn và thực tế hơn, nhưng không có gì ngạc nhiên khi quá trình này mất nhiều thời gian hơn để thực hiện.
Điều đáng chú ý ở điểm này là chúng ta đang xem xét các đối tượng có số lượng đỉnh thấp so với trò chơi 3D tiên tiến. Quay trở lại bài viết này một chút và xem kỹ hình ảnh của Crysis: chỉ riêng trong một cảnh đó đã có hơn một triệu hình tam giác. Chúng ta có thể hình dung được có bao nhiêu hình tam giác đang được đẩy xung quanh trong một trò chơi hiện đại bằng cách sử dụng điểm chuẩn của Unigine’s Valley (tải xuống).

Mọi đối tượng trong hình ảnh này được mô hình hóa bởi các đỉnh được kết nối với nhau, vì vậy chúng tạo thành các hình nguyên thủy bao gồm các hình tam giác. Điểm chuẩn cho phép chúng tôi chạy chế độ khung dây giúp chương trình hiển thị các cạnh của mỗi hình tam giác bằng một đường trắng sáng.

Cây cối, thực vật, đá, đất, núi – tất cả đều được xây dựng từ các hình tam giác, và mỗi một trong số chúng đã được tính toán về vị trí, hướng và màu sắc của nó – tất cả đều tính đến vị trí của nguồn sáng và vị trí và hướng của camera. Tất cả các thay đổi được thực hiện đối với các đỉnh phải được đưa trở lại trò chơi để trò chơi biết mọi thứ ở đâu cho khung hình tiếp theo được hiển thị; điều này được thực hiện bằng cách cập nhật bộ đệm đỉnh.
Mặc dù vậy, thật đáng kinh ngạc, đây không phải là phần khó của quá trình kết xuất và với phần cứng phù hợp, tất cả sẽ hoàn thành chỉ trong vài phần nghìn giây! Bước sang giai đoạn tiếp theo.
Sau khi tất cả các đỉnh đã được xử lý xong và cảnh 3D của chúng tôi được hoàn thiện về vị trí của mọi thứ, quá trình kết xuất sẽ chuyển sang một giai đoạn rất quan trọng. Cho đến nay, trò chơi thực sự là 3 chiều nhưng khung hình cuối cùng thì không – điều đó có nghĩa là một chuỗi thay đổi phải diễn ra để chuyển đổi thế giới được xem từ không gian 3D chứa hàng nghìn điểm được kết nối thành khung vẽ 2D gồm các pixel màu riêng biệt . Đối với hầu hết các trò chơi, quá trình này bao gồm ít nhất hai bước: chiếu không gian màn hình và tạo điểm ảnh .

Sử dụng lại công cụ kết xuất web, chúng ta có thể buộc nó hiển thị khối lượng thế giới ban đầu được biến thành một hình ảnh phẳng như thế nào. Vị trí của máy ảnh, xem cảnh 3D, ở ngoài cùng bên trái; các đường kéo dài từ điểm này tạo ra cái được gọi là sự thất vọng (giống như một kim tự tháp nằm nghiêng) và mọi thứ trong sự thất vọng đều có khả năng xuất hiện trong khung hình cuối cùng. Một cách nhỏ vào sự thất vọng là chế độ xem – đây thực chất là những gì màn hình sẽ hiển thị và toàn bộ toán học được sử dụng để chiếu mọi thứ trong sự thất vọng lên chế độ xem, từ góc nhìn của máy ảnh.
Mặc dù đồ họa trên khung nhìn xuất hiện ở dạng 2D, nhưng dữ liệu bên trong vẫn thực sự là 3D và thông tin này sau đó được sử dụng để tìm ra nguyên mẫu nào sẽ hiển thị hoặc chồng lên nhau. Điều này có thể khó thực hiện một cách đáng ngạc nhiên vì người nguyên thủy có thể tạo bóng trong trò chơi có thể nhìn thấy được, ngay cả khi người nguyên thủy không thể. Việc loại bỏ các phần gốc được gọi là loại bỏ và có thể tạo ra sự khác biệt đáng kể đối với tốc độ hiển thị toàn bộ khung hình. Khi tất cả điều này đã được thực hiện – sắp xếp các phần nguyên thủy có thể nhìn thấy và không nhìn thấy được, tạo thành các hình tam giác nằm bên ngoài lớp phủ, v.v. – giai đoạn cuối cùng của 3D được đóng lại và khung hình trở thành 2D hoàn toàn thông qua quá trình tạo điểm ảnh.

Hình ảnh trên cho thấy một ví dụ rất đơn giản về một khung chứa một nguyên mẫu. Lưới mà các pixel của khung tạo ra được so sánh với các cạnh của hình bên dưới và ở những nơi chúng chồng lên nhau, một pixel được đánh dấu để xử lý. Đành rằng kết quả cuối cùng trong ví dụ hiển thị trông không giống hình tam giác ban đầu lắm nhưng đó là do chúng tôi không sử dụng đủ pixel. Điều này đã dẫn đến một vấn đề gọi là răng cưa , mặc dù có rất nhiều cách để giải quyết vấn đề này. Đây là lý do tại sao việc thay đổi độ phân giải (tổng số pixel được sử dụng trong khung hình) của trò chơi lại có tác động lớn đến giao diện của trò chơi đó: các pixel không chỉ thể hiện tốt hơn hình dạng nguyên thủy mà còn giảm tác động của những thứ không mong muốn. răng cưa.
Sau khi hoàn thành phần này của trình tự hiển thị, nó sẽ chuyển sang phần lớn: màu cuối cùng của tất cả các pixel trong khung.
Vì vậy, bây giờ chúng ta đến phần thử thách nhất trong tất cả các bước trong chuỗi kết xuất. Nhiều năm trước, đây không gì khác hơn là bọc quần áo của người mẫu (hay còn gọi là họa tiết) lên các vật thể trên thế giới, sử dụng thông tin ở dạng pixel (ban đầu từ các đỉnh). Vấn đề ở đây là trong khi kết cấu và khung đều là 2D, thế giới mà chúng được gắn vào đã bị xoắn, di chuyển và định hình lại trong giai đoạn đỉnh. Tuy nhiên, nhiều toán học hơn được sử dụng để giải thích cho điều này, nhưng kết quả có thể tạo ra một số vấn đề kỳ lạ.

Trong hình ảnh này, một bản đồ kết cấu bàn cờ đơn giản đang được áp dụng cho một bề mặt phẳng trải dài ra xa. Kết quả là một mớ hỗn độn chói tai, với răng cưa lại xuất hiện cái đầu xấu xí của nó. Giải pháp bao gồm các phiên bản nhỏ hơn của bản đồ kết cấu (được gọi là mipmaps ), việc sử dụng lặp lại dữ liệu được lấy từ các kết cấu này (được gọi là lọc ) và thậm chí nhiều phép toán hơn để kết hợp tất cả lại với nhau. Hiệu quả của việc này khá rõ rệt:

Điều này từng là công việc thực sự khó khăn đối với bất kỳ trò chơi nào nhưng giờ thì không còn như vậy nữa, bởi vì việc sử dụng tự do các hiệu ứng hình ảnh khác, chẳng hạn như phản chiếu và đổ bóng, có nghĩa là việc xử lý kết cấu chỉ trở thành một phần tương đối nhỏ của pixel. công đoạn chế biến. Chơi trò chơi ở độ phân giải cao hơn cũng tạo ra khối lượng công việc cao hơn trong giai đoạn rasterization và pixel của quá trình kết xuất, nhưng có tác động tương đối ít trong giai đoạn đỉnh. Mặc dù màu ban đầu do ánh sáng được thực hiện ở giai đoạn đỉnh, các hiệu ứng ánh sáng huyền ảo hơn cũng có thể được sử dụng ở đây.

Ở hình ảnh trên, chúng ta không còn dễ dàng nhận thấy sự thay đổi màu sắc giữa các hình tam giác, tạo cảm giác đây là một vật thể trơn tru, liền mạch. Trong ví dụ cụ thể này, quả cầu thực sự được tạo thành từ cùng số lượng hình tam giác mà chúng ta đã thấy trong quả cầu màu xanh lá cây trước đó trong bài viết này, nhưng thói quen tô màu pixel tạo ấn tượng rằng nó có nhiều hình tam giác hơn đáng kể.

Trong nhiều trò chơi, giai đoạn pixel cần được chạy một vài lần. Ví dụ: một tấm gương hoặc mặt hồ phản chiếu thế giới, giống như nhìn từ máy ảnh, cần phải kết xuất thế giới ngay từ đầu. Mỗi lần chạy qua được gọi là một lượt và một khung hình có thể dễ dàng bao gồm 4 lượt trở lên để tạo ra hình ảnh cuối cùng.
Đôi khi, giai đoạn đỉnh cũng cần được thực hiện lại để vẽ lại thế giới từ một góc nhìn khác và sử dụng góc nhìn đó như một phần của cảnh mà người chơi trò chơi nhìn thấy. Điều này yêu cầu sử dụng các mục tiêu kết xuất – bộ đệm đóng vai trò là nơi lưu trữ cuối cùng cho khung nhưng có thể được sử dụng làm kết cấu trong một lượt khác.
Để hiểu sâu hơn về mức độ phức tạp tiềm ẩn của giai đoạn pixel, hãy đọc phân tích khung hình của Doom 2016 của Adrian Courrèges và ngạc nhiên trước số bước cần thiết đáng kinh ngạc để tạo một khung hình duy nhất trong trò chơi đó.

Tất cả công việc này trên khung cần được lưu vào bộ đệm, cho dù là kết quả đã hoàn thành hay bộ lưu trữ tạm thời và nói chung, một trò chơi sẽ có ít nhất hai bộ đệm khi đang di chuyển cho chế độ xem cuối cùng: một sẽ là “công việc đang diễn ra” và cái còn lại đang chờ màn hình truy cập hoặc đang trong quá trình hiển thị. Luôn cần có sẵn bộ đệm khung để kết xuất vào, vì vậy khi tất cả bộ đệm đã đầy, cần phải thực hiện một hành động để di chuyển mọi thứ và bắt đầu một bộ đệm mới. Phần cuối cùng trong việc đăng xuất khung là một lệnh đơn giản (ví dụ: present ) và với lệnh này, bộ đệm khung cuối cùng được hoán đổi, màn hình hiển thị khung cuối cùng và khung tiếp theo có thể được bắt đầu.

Trong hình ảnh này, từ Assassin’s Creed Odyssey của Ubisoft, chúng ta đang xem nội dung của bộ đệm khung đã hoàn thành. Hãy coi nó giống như một bảng tính, với các hàng và cột ô, không chứa gì khác ngoài một số. Các giá trị này được gửi đến màn hình hoặc TV dưới dạng tín hiệu điện và màu sắc của các điểm ảnh trên màn hình được thay đổi thành các giá trị cần thiết. Bởi vì chúng ta không thể thực hiện CSI: TechSpot bằng mắt, chúng ta nhìn thấy một hình ảnh phẳng, liên tục nhưng bộ não của chúng ta diễn giải nó là có chiều sâu – tức là 3D. Một khung hình tuyệt vời khi chơi game, nhưng có quá nhiều thứ đang diễn ra đằng sau hậu trường (xin thứ lỗi cho sự chơi chữ), bạn nên xem cách các lập trình viên xử lý tất cả.
Tìm ra cách làm cho trò chơi thực hiện và quản lý tất cả công việc này (toán học, đỉnh, kết cấu, ánh sáng, bộ đệm, bạn có thể đặt tên cho nó…) là một nhiệm vụ khổng lồ. May mắn thay, có sự trợ giúp dưới dạng gọi tắt là giao diện lập trình ứng dụng hoặc API.
Các API để kết xuất làm giảm độ phức tạp tổng thể bằng cách cung cấp các cấu trúc, quy tắc và thư viện mã, cho phép các lập trình viên sử dụng các hướng dẫn đơn giản hóa không phụ thuộc vào bất kỳ phần cứng nào có liên quan. Chọn bất kỳ trò chơi 3D nào, được phát hành trong 3 năm qua cho PC và trò chơi đó sẽ được tạo bằng một trong ba API nổi tiếng: Direct3D, OpenGL hoặc Vulkan. Có những cái khác, đặc biệt là trong bối cảnh di động, nhưng chúng tôi sẽ gắn bó với những cái này cho bài viết này.

Mặc dù có sự khác biệt về cách diễn đạt các hướng dẫn và thao tác (ví dụ: một khối mã để xử lý pixel trong DirectX được gọi là trình đổ bóng pixel ; trong Vulkan, nó được gọi là trình đổ bóng phân đoạn ), kết quả cuối cùng của khung hình được hiển thị không phải là , hay đúng hơn là không nên khác đi.
Trường hợp sẽ có sự khác biệt tùy thuộc vào phần cứng nào được sử dụng để thực hiện tất cả quá trình kết xuất. Điều này là do các hướng dẫn được đưa ra bằng cách sử dụng API cần được dịch để phần cứng thực hiện – điều này được xử lý bởi trình điều khiển của thiết bị và nhà sản xuất phần cứng phải dành nhiều tài nguyên và thời gian để đảm bảo trình điều khiển thực hiện chuyển đổi nhanh nhất và chính xác nhất có thể .

Hãy sử dụng phiên bản beta trước đó của trò chơi Nguyên tắc Talos năm 2014 của Croteam để chứng minh điều này, vì nó hỗ trợ 3 API mà chúng tôi đã đề cập. Để khuếch đại sự khác biệt mà sự kết hợp giữa trình điều khiển và giao diện đôi khi có thể tạo ra, chúng tôi đã chạy điểm chuẩn tích hợp tiêu chuẩn trên cài đặt hình ảnh tối đa ở độ phân giải 1080p. PC được sử dụng chạy ở xung nhịp mặc định và trang bị Intel Core i7-9700K, Nvidia Titan X (Pascal) và 32 GB RAM DDR4.
Phân tích đầy đủ về ý nghĩa đằng sau những số liệu này không nằm trong mục tiêu của bài viết này và chúng chắc chắn không có nghĩa là một API ‘tốt hơn’ so với API khác (đây là phiên bản beta, đừng quên), vì vậy chúng tôi’ Tôi sẽ để lại vấn đề với nhận xét rằng việc lập trình cho các API khác nhau đưa ra nhiều thách thức khác nhau và hiện tại, sẽ luôn có một số thay đổi về hiệu suất. Nói chung, các nhà phát triển trò chơi sẽ chọn API mà họ có kinh nghiệm làm việc nhất và tối ưu hóa mã của họ trên cơ sở đó. Đôi khi từ engine được sử dụng để mô tả mã kết xuất, nhưng về mặt kỹ thuật, engine là gói đầy đủ xử lý tất cả các khía cạnh trong trò chơi, không chỉ đồ họa của nó.
Tạo một chương trình hoàn chỉnh, từ đầu, để hiển thị trò chơi 3D không phải là điều đơn giản, đó là lý do tại sao rất nhiều trò chơi ngày nay cấp phép toàn bộ hệ thống từ các nhà phát triển khác (ví dụ: Unreal Engine); bạn có thể hiểu được quy mô bằng cách xem công cụ nguồn mở cho Quake củaSoftware và duyệt qua tệp gl_draw.c – mục duy nhất này chứa các hướng dẫn cho các hoạt động kết xuất khác nhau được thực hiện trong trò chơi và chỉ đại diện cho một phần nhỏ của toàn bộ động cơ. Quake đã hơn 20 năm tuổi và toàn bộ trò chơi (bao gồm tất cả nội dung, âm thanh, nhạc, v.v.) có kích thước 55 MB; ngược lại, Far Cry 5 của Ubisoft chỉ giữ các shader được trò chơi sử dụng trong một tệp có kích thước 62 MB.
Mọi thứ mà chúng tôi đã mô tả cho đến nay đều có thể được tính toán và xử lý bởi CPU của bất kỳ hệ thống máy tính nào; bộ xử lý x86-64 hiện đại dễ dàng hỗ trợ tất cả các phép toán cần thiết và có các bộ phận chuyên dụng trong đó cho những việc như vậy. Tuy nhiên, thực hiện công việc này để kết xuất một khung bao gồm rất nhiều phép tính lặp đi lặp lại và yêu cầu một lượng xử lý song song đáng kể. CPU cuối cùng không được thiết kế cho việc này, vì chúng quá chung chung theo thiết kế bắt buộc. Tất nhiên, các chip chuyên dụng cho loại công việc này được gọi là GPU (đơn vị xử lý đồ họa) và chúng được chế tạo để thực hiện các phép toán cần thiết cho DirectX, OpenGL và Vulkan rất nhanh và cực kỳ song song.
Một cách để chứng minh điều này là sử dụng điểm chuẩn cho phép chúng tôi hiển thị khung bằng CPU và sau đó sử dụng phần cứng chuyên dụng. Chúng tôi sẽ sử dụng V-ray NEXT của Chaos Group; công cụ này thực sự thực hiện dò tia chứ không phải kết xuất mà chúng tôi đã xem xét trong bài viết này, nhưng phần lớn việc xử lý số yêu cầu các khía cạnh phần cứng tương tự.

Để hiểu được sự khác biệt giữa những gì CPU có thể làm và những gì phần cứng được thiết kế tùy chỉnh phù hợp có thể đạt được, chúng tôi đã chạy điểm chuẩn GPU V-ray ở 3 chế độ: chỉ CPU, chỉ GPU và sau đó là CPU+GPU cùng nhau. Kết quả có sự khác biệt rõ rệt:
Chúng ta có thể bỏ qua các đơn vị đo lường trong tiêu chuẩn này, vì sự khác biệt gấp 5 lần về đầu ra không phải là vấn đề nhỏ. Nhưng đây không phải là một bài kiểm tra giống trò chơi cho lắm, vì vậy, hãy thử một thứ gì đó khác và theo phong cách cổ điển một chút với 3DMark03 của Futuremark. Chạy thử nghiệm Wings of Fury đơn giản, chúng ta có thể buộc nó thực hiện tất cả các trình tạo bóng đỉnh (tức là tất cả các quy trình được thực hiện để di chuyển và tô màu các hình tam giác) bằng CPU.

Kết quả không thực sự gây ngạc nhiên nhưng tuy nhiên, nó rõ ràng hơn nhiều so với những gì chúng ta thấy trong thử nghiệm V-quang:
Với việc CPU xử lý tất cả các phép tính đỉnh, trung bình mỗi khung hình mất 13 mili giây để được kết xuất và hiển thị; đẩy phép toán đó lên GPU lần này giảm xuống còn 0,6 mili giây. Nói cách khác, nó nhanh hơn 20 lần.
Sự khác biệt thậm chí còn đáng chú ý hơn nếu chúng ta thử bài kiểm tra phức tạp nhất, Mẹ thiên nhiên, trong điểm chuẩn. Với các trình đổ bóng đỉnh được xử lý bởi CPU, kết quả trung bình là 3,1 khung hình/giây nhỏ! Mang GPU vào và tốc độ khung hình trung bình tăng lên 1388 khung hình/giây: nhanh hơn gần 450 lần. Bây giờ, đừng quên rằng 3DMark03 đã được 16 năm tuổi và thử nghiệm chỉ xử lý các đỉnh trên CPU – quá trình quét điểm ảnh và giai đoạn pixel vẫn được thực hiện thông qua GPU. Nó sẽ như thế nào nếu nó hiện đại và mọi thứ được thực hiện bằng phần mềm?

Hãy thử lại công cụ điểm chuẩn của Unigine’s Valley – nó tương đối mới, đồ họa mà nó xử lý rất giống với đồ họa đã thấy trong các trò chơi như Far Cry 5 của Ubisoft; nó cũng cung cấp trình kết xuất dựa trên phần mềm đầy đủ, ngoài tuyến GPU DirectX 11 tiêu chuẩn. Kết quả không cần phân tích nhiều nhưng chạy phiên bản thử nghiệm DirectX 11 chất lượng thấp nhất trên GPU cho kết quả trung bình là 196 khung hình/giây. Phiên bản phần mềm? Bỏ qua một số sự cố, PC thử nghiệm mạnh mẽ đạt tốc độ trung bình 0,1 khung hình mỗi giây – chậm hơn gần hai nghìn lần.
Lý do cho sự khác biệt như vậy nằm ở định dạng toán học và dữ liệu mà kết xuất 3D sử dụng. Trong CPU, chính các đơn vị dấu chấm động (FPU) trong mỗi lõi thực hiện các phép tính; i7-9700K của PC thử nghiệm có 8 lõi, mỗi lõi có hai FPU. Mặc dù các đơn vị trong Titan X khác nhau về thiết kế, nhưng cả hai đều có thể thực hiện cùng một phép toán cơ bản, trên cùng một định dạng dữ liệu. GPU cụ thể này có hơn 3500 đơn vị để thực hiện một phép tính có thể so sánh được và mặc dù chúng không có xung nhịp gần bằng CPU (1,5 GHz so với 4,7 GHz), GPU vượt trội hơn bộ xử lý trung tâm thông qua số lượng đơn vị tuyệt đối.
Mặc dù Titan X không phải là cạc đồ họa chính, nhưng ngay cả một mẫu giá rẻ cũng sẽ hoạt động tốt hơn bất kỳ CPU nào, đó là lý do tại sao tất cả các trò chơi 3D và API được thiết kế cho phần cứng chuyên dụng, chuyên dụng. Vui lòng tải xuống V-ray, 3DMark hoặc bất kỳ điểm chuẩn Unigine nào và kiểm tra hệ thống của riêng bạn – đăng kết quả lên diễn đàn để chúng tôi có thể thấy GPU được thiết kế tốt như thế nào để hiển thị đồ họa trong trò chơi.
Đây là phần tóm tắt ngắn gọn về cách tạo một khung hình trong trò chơi 3D, từ các dấu chấm trong không gian đến các pixel có màu trong màn hình.
Ở cấp độ cơ bản nhất, toàn bộ quá trình không gì khác hơn là làm việc với các con số, bởi vì đó là tất cả những gì máy tính làm. Tuy nhiên, rất nhiều điều đã bị bỏ qua trong bài viết này, để giữ cho nó tập trung vào những điều cơ bản (chúng ta có thể sẽ theo dõi sau bằng cách tìm hiểu sâu hơn về cách đồ họa máy tính được tạo ra). Chúng tôi không bao gồm bất kỳ phép toán thực tế nào được sử dụng, chẳng hạn như đại số tuyến tính Euclide, lượng giác và phép tính vi phân được thực hiện bởi các trình đổ bóng đỉnh và pixel; chúng tôi đã giới thiệu kỹ về cách xử lý họa tiết thông qua lấy mẫu thống kê và bỏ qua các hiệu ứng hình ảnh thú vị như che khuất không gian xung quanh màn hình, khử nhiễu vệt tia, hình ảnh dải động cao hoặc khử răng cưa tạm thời.
Nhưng lần tới khi bạn chơi một vòng Call of Mario: Death Duty Battleyard, chúng tôi hy vọng rằng không chỉ bạn sẽ thấy đồ họa với một cảm giác mới lạ mà còn muốn tìm hiểu thêm.