• Thứ Năm, 12/11/2009 16:17 (GMT+7)

    Những nét mới trong DirectX 11

    Thế giới đồ họa đang chờ đón một “luồng gió” mới mà DirectX 11 hứa hẹn đem lại. Hi vọng với những cải tiến đáng kể, DirectX 11 sẽ giúp các nhà phát triển nhẹ nhàng hơn trong việc lập trình nhưng lại tăng hiệu quả xử lý.

    DirectX là tập hợp các giao diện lập trình ứng dụng (API) nhằm điều khiển các tác vụ liên quan đến đa phương tiện, đặc biệt là lập trình game và hình ảnh. Về nguồn gốc, tên của các API được bắt đầu bằng Direct, chẳng hạn như Direct3D, DirectDraw, DirectMusic, DirectPlay, DirectSound… Cái tên DirectX được đặt chung cho tất cả các API này (trong đó X là tên của các API riêng biệt). Khi Microsoft cho phép phát triển thể loại game console, X được dùng trong tên Xbox để chỉ ra rằng, console được xây dựng trên công nghệ DirectX. Bắt đầu xuất hiện từ năm 1995 với phiên bản DirectX 1.0, sau hơn 14 năm nghiên cứu và phát triển, Microsoft đã phát triển công nghệ này lên phiên bản mới nhất hiện nay là DirectX 10.1 (nâng cấp từ DirectX 10). DirectX 10 chưa phải là hoàn hảo (khó lập trình và phải định nghĩa phần cứng), nhưng thực tế Microsoft đã tạo ra Direct3D 10 trọn vẹn. DirectX 10.1 ra đời để sửa chữa những sai lầm đó, chỉ có AMD đưa ra được bản nâng cấp API, trong khi đó NVIDIA thì cho rằng DirectX 10.1 vẫn không thực sự nâng cao được hiệu quả xử lý, vì vậy, họ nghĩ các nhà phát triển cần tăng tốc GPU vật lý và họ đã chọn cách tập trung vào việc này trong các cấu trúc đồ họa dòng GTX 200 mới nhất hiện nay. Và để nâng cấp, hoàn thiện hơn giao diện lập trình giúp cho các nhà phát triển game, đồ họa có thể lập trình dễ dàng hơn, tăng hiệu quả xử lý trên các giao diện đó, tháng 7/2009, Microsoft đã công bố chính thức phiên bản DirectX 11.

    Các tập lệnh của API mới đang được Microsoft hoàn thiện và phiên bản cho người dùng cuối sẽ được chờ đón cùng với HĐH Windows 7 (cuối 2009 hay đầu năm 2010). Không như DirectX 10, DirectX 11 cho phép tương thích ngược với các phiên bản trước Windows Vista. Hi vọng rằng DirectX 11 sẽ không bị đối xử như DirectX 10 nhờ tính tương thích ngược và có vài tính năng tương thích cho cả phần cứng DirectX 9 và 10/10.1.

    Công nghệ đường ống DirectX 11

    Điều quan trọng của API mới là khả năng chỉnh sửa nội dung, cho phép các nhà phát triển tạo nhiều đối tượng phức tạp hơn và mang tính thực tế cao. Điều này phù hợp với sự thúc đẩy của Microsoft trong việc cải thiện đa hướng và hiệu năng, do khuynh hướng hiện tại là xây dựng đối tượng nhờ tăng độ phức tạp của các lưới tam giác và sau đó, giảm bớt số tam giác tùy theo sức mạnh của hệ thống cụ thể.

    Hình 1: Cấu tạo đường ống của Driect3D 11

    Để giải quyết vấn đề này triệt để, Microsoft giới thiệu 3 lớp mới trong công nghệ đường ống (pipeline) DirectX 11: Đổ bóng bề mặt (Hull Shader), công cụ phủ Tessellator và đổ bóng vùng (Domain Shader). Trong đó, đổ bóng bề mặt và đổ bóng vùng cũng bao gồm cả quá trình phủ Tessellator. Nếu bạn bỏ đi những công đoạn này, bạn sẽ có cấu trúc đường ống của DirectX 10, mặc dù có vài đặc điểm nhỏ khác làm cho chúng khác nhau về kỹ thuật.

    Bổ sung vào 3 lớp trên, quá trình đổ bóng điểm trong cấu trúc đường ống đã có vài thay đổi, cho phép tính toán đổ bóng (Compute Shader - CS) nhiều tác vụ đa năng. Theo ý kiến của các nhà phát triển game và ứng dụng, CS có nhiều cách sử dụng. Chỉ cần có một cách phân luồng cho một ứng dụng, thì sẽ có một cách dùng cho CS. (Xem hình 1)

    Công nghệ phủ (Tessellation)

    Công nghệ phủ đã xuất hiện ngay từ khi Microsoft công bố Xbox 360 vào cuối năm 2005 – khi Xenos GPU của ATI đã có đơn vị phủ phần cứng chuyên dụng. Việc bổ sung này nhằm cải thiện quá trình chỉnh sửa nội dung và cho phép các nhà phát triển cũng như chuyên gia đồ họa sáng tạo nhiều đối tượng thực tế hơn và phức tạp hơn mà không cần bộ nhớ đồ họa quá lớn.

    Hình 2: Tạo đối tượng với cấu trúc đường ống hiện tại

    Về cơ bản, một đối tượng khi ở xa sẽ ít chi tiết và ít các hình tam giác, nhưng khi tiến lại gần người xem thì số lượng tam giác và chi tiết sẽ tăng theo hàm mũ. Hình ảnh đẹp chỉ khi nó xuất toàn bộ, tổng số tam giác trung bình phải lớn hơn hằng số cho phép thì sẽ ít xuất hiện hiện tượng dừng hình, nhảy hình trong lúc hiển thị.

    Theo truyền thống, việc tạo đối tượng bắt đầu từ mô hình khung Sub-D, đến hoạt cảnh và ánh xạ phủ bề mặt trước khi một lưới đa giác áp dụng nó. Một khi lưới đã được áp dụng, nó được chia lại nhiều cấp bậc chi tiết (LOD – Level Of Detail) trước khi được gửi đến GPU. Các cấp bậc khác nhau có thể được sử dụng cho những lớp khác nhau của phần cứng hoặc chúng có thể được dùng khi nhân vật hay đối tượng của nội dung xa màn hình, bổ sung nhiều chi tiết hơn cho người xem, nhưng tốn càng ít “công sức” càng tốt.

    (Xem hình 2)

    Microsoft và AMD cho rằng Tessellator của Xbox 360 và cả Radeon HD 2000/3000/4000 đều không tương thích với DirectX 11, nhưng Tessellator của DirectX 11 có thể tương thích với tất cả các phần cứng khác đang có mặt trên thị trường. Tuy nhiên, một điểm tiến bộ là công cụ phủ của Radeon HD 4000 đã có vài thay đổi, cho phép lập trình viên truy xuất vào tính năng trong ứng dụng của DirectX 10 – Điều này là một bước phát triển so với đơn vị phủ trong của GPU dòng HD 2000 và 3000.

    Hình 3: Hull Shader trong tiến trình

    Mặc dù các nhà phát triển không thích dùng Tessellator cho các ứng dụng ra đời ngày nay, công nghệ phủ của RV7xx đã tỏ ra là một nền tảng hữu dụng vì nó cho phép các nhà phát triển và chuyên gia đồ họa làm thí nghiệm với công nghệ phủ trong một môi trường lập trình khá giống DirectX 11. Nói tóm lại, công nghệ đường ống đồ họa DirectX 11 là một tập hợp mẹ của DirectX 10 mà sự bổ sung chủ yếu là công nghệ phủ.

    Tuy công cụ phủ DirectX 11 mạnh mẽ và linh hoạt hơn các thành phần phủ của GPU AMD gần đây (bao gồm cả Xenos). Nhưng thật sự, Tessellator vẫn không thể lập trình được mà chỉ dựa vào thành phần Hull Shader (đổ bóng bề mặt) để được cung cấp thông tin phù hợp và sau đó, Domain Shader nhận dữ liệu phủ và xuất ra các đỉnh trước khi nó chuyển xuống các phần tiếp theo của cấu trúc đường ống.

    Công nghệ phủ có cả trong Hull Shader và Domain Shader

    Hull Shader là nơi tiến trình phủ một đối tượng được thiết lập – nó điều khiển các điểm của mảng rồi sau đó tính toán cấp độ phủ yêu cầu. Sau bước chuyển đổi cơ bản, các điểm điều khiển sẽ được chuyển vào Domain Shader – bộ phận phủ không thấy được các điểm điều khiển.

    Thay vào đó, công cụ phủ Tessellator được cung cấp một số TessFactor, về cơ bản sẽ cho biết cấp độ phủ được yêu cầu trên một miếng khảm cụ thể. Hull Shader cũng báo cho bộ phận phủ phương thức (mode) mà nó nên thực hiện – nhà phát triển có thể định rõ cách mà tiến trình phủ thực hiện công việc (mặc dù đơn vị phủ là tính năng cố định, nhưng có vài phương thức để lựa chọn).

    Hình 4: Hoạt động của công cụ phủ Tessellator

    Sau đó, Tessellator nhận những gì được cung cấp bởi Hull Shader rồi kết hợp các mảng để tạo yêu cầu hình học bổ sung. Khi quá trình này hoàn thành, các điểm vùng (domain point) và dữ liệu hình học sẽ xuất hiện.

    (Xem các hình 3, 4,5)

    Các điểm vùng được chuyển xuống Domain Shader (làm việc trên từng điểm cơ bản), khi đó bộ phận này sẽ nhận điểm vùng và tạo đỉnh cho các giai đoạn tiếp theo. Trong khi đó, dữ liệu hình học đi thẳng xuống lớp gốc của đường ống – lý do là dữ liệu này không cần đổ bóng, nhưng lại cần chuyển đổi.

    (Xem hình 6)

    Điều quan trọng ở đây là cả lớp phủ của đường ống không làm việc với các tam giác mà chỉ làm việc với các miếng khảm và điểm. Các miếng khảm sẽ mô tả đường cong hoặc vùng bề mặt bởi 4 cạnh. Tất nhiên, các mảng có thể được mô tả với những tam giác, nhưng điều đó không phổ biến, vì hầu hết các ứng dụng chỉnh sửa 3D đều làm việc với 4 cạnh. Đây là lần đầu tiên DirectX không làm việc với tam giác, đó là một bước tiến đáng kể.

    Tất cả những đặc điểm mô tả trên là bước tiến rõ rệt trong công nghệ đường ống của DirectX 11, hứa hẹn sẽ mang đến hiệu quả không ngờ khi bổ sung thật nhiều chi tiết cho công nghệ game tương lai. Tất nhiên, các nhà phát triển không phải sử dụng lớp này của đường ống nếu họ không muốn.

    Bộ đổ bóng Compute Shader

    Hình 5: Hoạt động của Domain Shader

    Compute Shader sẽ nhận dữ liệu từ Pixel Shader. Bộ đổ bóng tính toán mới này hỗ trợ tốt hơn cho nhiều hãng phần cứng khác nhau, gia tăng khả năng lập trình cho các GPU đa năng (GPGPU – General Purpose GPU) mà NVIDIA và AMD đang tích cực cải tiến trong những năm gần đây. Nhờ cải tiến Compute Shader, ngoài việc dựng hình, các GPU giờ đây thực hiện cả những tính toán khác, chẳng hạn như tạo hiệu ứng bóng mờ.

    Microsoft cho rằng các nhà phát triển sẽ cảm thấy dễ dàng hơn trong việc phát triển các ứng dụng game trong khi các phần cứng được tận dụng hết khả năng. Dự kiến, bộ phát triển phần mềm (Software Development Kit) sẽ được Microsoft phát hành trong thời gian tới.

    Hỗ trợ đa luồng

    Mặc dù kỹ thuật đa luồng (multi-threading) không còn mới trong công nghệ đường ống đồ họa nhưng đây là tính năng quan trọng cho DirectX 11. Thậm chí, nó trở nên quan trọng hơn khi sử dụng phần cứng DirectX10 cũng như cập nhật trình điều khiển (driver).

    CPU 2 nhân là xu thế hiện nay và 4 nhân bây giờ không còn là lựa chọn quá đắt cho game thủ hay những chuyên gia đồ họa; trong tương lai, 4 nhân sẽ thay thế 2 nhân như một xu thế tất yếu. Điều đáng ngạc nhiên là DirectX vẫn chưa thể xử lý đa luồng. Để “che đậy’” thiếu sót này, cả AMD và NVIDIA đưa ra các trình điều khiển đa luồng, nhưng thành công còn hạn chế vì bản chất API là đơn luồng. API của DirectX 11 đem lại cho lập trình viên khả năng điều khiển GPU từ CPU đa nhân. Những thay đổi trong mô hình API và mô hình trình điều khiển của DirectX 11 đã cải thiện việc tính toán của CPU. Việc truy cập các thiết bị không đồng bộ giờ đây đã được thực hiện thông qua hai tính năng chính của đối tượng thiết bị trong thư viện Direct3D 11.

    Hình 6: Tạo đối tượng với cấu trúc đường ống mới

    Cách để Microsoft đạt được điều này là tách một thiết bị Direct3D thành 3 giao diện riêng biệt: giao diện ngữ cảnh thiết bị (Device Context), giao diện ngữ cảnh trực tiếp (Immediate Context) và giao diện ngữ cảnh trì hoãn (Deferred Context). Immediate Context có một luồng trong khi giao diện Device Context và Deferred Context thì có nhiều luồng hơn, được chỉ định xếp hàng các tác vụ cho Immediate Context hoặc Render.

    Mỗi giao diện thiết bị có thể tải luồng tài nguyên khi và chỉ khi nó cần, trong khi giao diện ngữ cảnh trì hoãn (Deferred Context interface) hoạt động như một ngữ cảnh thiết bị đơn luồng cho các toán tử dựng hình tương lai, nó xếp hàng các lệnh gọi (hoặc Display Lists) trước khi chuyển chúng vào giao diện ngữ cảnh trực tiếp.

    Khi muốn tối ưu hoá phần cứng hỗ trợ DirectX 10, giao diện ngữ cảnh trì hoãn sẽ cần lập trình trên phần mềm thay vì phần cứng. Vì thế, giao diện ngữ cảnh trì hoãn sẽ không được chia luồng tự do trên phần cứng DirectX 10 và một luồng chuyên dụng sẽ phải được chỉ định đến ngữ cảnh trì hoãn ở cấp độ API.

    Liên kết đổ bóng động (Dynamic Shader Linkage)

    Một trong những vấn đề mà các nhà lập trình game đối mặt hiện nay là sự mở rộng và tính linh hoạt đổ bóng quá phức tạp. Ví dụ, nếu trong vài trường hợp cần nhiều shader thì một Uber Shader lớn thường được dùng vì nó kết nối được tất cả các shader cần thiết vào trong một đoạn mã (code), tối giản lập trình.

    Tuy nhiên, việc tối giản lập trình theo hướng này lại làm cho việc đổ bóng phức tạp vô cùng, nó không chỉ kém hiệu quả hơn các shader riêng lẻ mà còn khó bẫy lỗi. Giải pháp viết các shader chuyên dụng không những phù hợp cho tất cả các trường hợp mà còn phù hợp cho các lớp khác nhau của phần cứng. Giải pháp này lại trở nên phức tạp và tốn nhiều chi phí liên quan đến việc chuyển đổi các shader, vì vậy Uber shader là một tuỳ chọn dễ dàng nhất cho nhà lập trình trong viết mã dù chưa phải lý tưởng.

    Microsoft tin rằng câu trả lời cho vấn đề này là các thủ tục con (subroutine), cho phép các nhà lập trình liên kết các shader với nhau, các nhà lập trình có thể tạo các shader chuyên dụng cho các lớp khác nhau của phần cứng được chỉ định, trong khi đó lại giảm phần lớn việc sử dụng thanh ghi so với việc dùng một shader đơn lẻ để điều khiển tất cả. Hi vọng rằng, điều này làm cho các nhà lập trình có hứng thú hơn khi viết shader, nhưng không có nghĩa là sẽ ảnh hưởng trực tiếp đến chất lượng hình ảnh mà cụ thể là chất lượng đổ bóng.

    Cải thiện nén kết cấu (Texture Compression)

    Đã lâu kể từ khi Microsoft nâng cấp thuật toán nén kết cấu của DirectX, giờ đây Microsoft lưu ý đến những thiếu sót của việc hỗ trợ cho các định dạng kết cấu HDR (High Dynamic Range), khi đa kết cấu không chú ý đến giải pháp nén gốc.

    Để bổ sung những gì cần thiết, Direct3D 11 sẽ giới thiệu 2 định dạng kết cấu mới là BC6 (hay BC6H) và BC7. BC6 là một kết cấu định dạng cao nhưng chỉ tiếc là mất dữ liệu gốc khi nén, thay vào đó, nó hỗ trợ công nghệ nén 6:1 với tốc độ 16bpc (bits per channel), điều này mang lại hiệu quả nhưng chất lượng kết cấu chưa cao trong trường hợp sử dụng mở rộng dải sáng có độ nhạy cao (high-dynamic) và không thật sự còn nguyên gốc.

    Bên cạnh đó, BC7 là một định dạng kết cấu LDR (Low Dynamic Range), hỗ trợ tỷ lệ nén 3:1 RGB. BC7 có thể được sử dụng với chất lượng giảm nhẹ (4:1 và 3:1 như đã nói ở trên) nhưng vẫn đảm bảo ở mức cao.

    Hơn nữa, Microsoft cho rằng, giải nén kết cấu trong DirectX 11 phải được làm theo cách hoàn toàn chính xác với thông số kỹ thuật của API thì chất lượng giải nén kết cấu mới tăng lên nhiều. Cho đến khi DirectX 11 xuất hiện, vẫn còn thời gian cho các hãng cung cấp phần cứng điều chỉnh cách mà phần cứng hỗ trợ DirectX 10 (và các DirectX cũ hơn) điều khiển giải nén kết cấu.

    Tóm lại, thế giới đồ họa đang chờ đón một “luồng gió” mới mà DirectX 11 hứa hẹn đem lại. Hi vọng với những cải tiến đáng kể, DirectX 11 sẽ giúp các nhà phát triển nhẹ nhàng hơn trong việc lập trình nhưng lại tăng hiệu quả xử lý.

    Tố Như

    Tổng hợp từ www.microsoft.com,
    http://www.bit-tech.net

    Từ khóa: Tố Như
    ID: A0910_112