Thảo luận về Dx10 ( updated )
Giới thiệu :
Dx9 ra đời từ tháng 12/2002 và đến tháng 12 2004 thì MS cho ra bản
dx9c .Dx ra đời giúp cho các nhà làm game tạo nên các hình ảnh càng
giống với thực hơn, giảm tải cho CPU từ đó CPU có thể thực hiện các
nhiệm vụ như tính tóan AI của NPC do vượt qua được những giới hạn
của bản dx cũ Tuy nhiên MS muốn dành riêng bản dx10 cho Vista ,nên
do đó sẽ ko co version dx10 nào trên WinXP.
Windows Display Driver Model:
Cùng với Dx10 ,MS giới thiệu 1 mẫu driver cho vista với mục đích làm
tăng sự ổn định của Windows .WDDM giúp tạo nên các GPU và video
memory ảo ,điều này có nghĩa là GPU cho phép chia sẻ tài nguyên cùng
tại 1 thời điểm.
Nói đơn giản khi chạy cùng lúc nhiều ứng dụng 3D khi switch sang dễ
gặp tình trạng treo máy (nhất là giao diện của Vista dùng rất nhiều ứng
dụng 3D) do đó nhờ mẫu driver trên giúp tăng sự ổn định của hệ thống
khi xài nhiều ứng dụng 3D.
Bên cạnh đó performance của hệ thống tăng lên việc sử dụng video
memory ảo ,driver có thể chuyển thông tin từ video memory sang system
memory nếu ứng dụng đó đòi hỏi
Ngoài ra WDDM giúp phục hồi display driver khi driver hay phần cứng
bị crash .Khi driver bị crash ,nó sẽ ngăn chặn ngay quá trình gây ra crash
đó ,không gây nên blue screen of death hoặc là treo máy.
Những giới hạn trong Dx9:
High API Overhead
-Mỗi khi nhận được lệnh từ ứng dụng ,Dx sẽ dịch ra cho driver hiểu và từ
đó sẽ điều khiển phần cứng làm việc ,quá trình này giới hạn số lượng vật
thể được vẽ cùng với các hiệu ứng trên nó.
-Số lượng vật thể có thể vẽ trong 1 frame bị giới hạn bởi số lệnh vẽ mà
Dx có thể thực hiện được bởi vì mỗi lệnh vẽ phải chiếm 1 số nhất định tài
nguyên của CPU ( overhead ). Trong Dx9 ta chỉ có thể vẽ khoảng 500 vật
trong 1 frame ( vật có thể là cái cây ,NPC ,súng ,nhà ….) .Nếu bạn nào để
ý khi chơi các game sử dụng Dx9 thì sẽ nhận ra điều này : ví dụ như cái
cây trong game, để làm 1 rừng cây thì nhà sản xuất game chỉ có thể vẽ 1
vài loại cây ,sau đó để cho chúng có vẻ khác nhau ,người ta thay đổi số lá
cây trên cành hoặc thay đổi màu sắc của cây .Ngoài ra số lượng effect
trên các vật thể cũng bị giới hạn tương tự theo cách trên .
Fixed Function Hardware Limitations:
Giới hạn thứ 2 của dx9 là mỗi phần( vertex shader ,pixel shader
,geometry shader …) trong quá trình đồ hoạ vật thể từ trứoc đến nay đều
tách biệt ,mỗi phần điều thực hiện 1 nhiệm vụ riêng biệt ,sự giới hạn này
dẫn đến hiện tượng thắt cổ chai .Một điều quan trọng nữa là sự giới hạn
này làm cho các nhà sản xuất game không thể hiện đuợc những ý tưởng
của họ trong game hay ứng dụng 3D.
Như hình trên trước đây việc xử lý hình ảnh phải theo 1 trình tự vetex
shader > geometry shader > pixel shader, việc này gây ra hiện tượng
quá trình xử lý hình ảnh này phải chờ quá trình kia ,việc này gây ra sự
giới hạn trong dx9
Resource Limitations:
Sự giới hạn về resource trong các bản Dx trước đã gây cản trở cho các
nhà làm game do các thuật toán muốn thực hiện được phải chia nhỏ ra ,từ
đó lại tiếp tục gây ra sự hao tốn tài nguyên của CPU.
Resource để xây dựng 1 ứng dụng 3D bao gồm : dependent texture reads,
bound textures, programme instructions.
Ngoài ra trong dx9 resource được xác nhận mỗi khi vật thể được sử dụng
trong 1 frame ( do đó có thể lên đến hàng triệu lần ) trứơc khi resource
đuợc sử dụng và vẽ .Việc xác nhận resource này sẽ hoàn tất truớc lệnh vẽ
và sẽ được loại đi để giúp cho thông tin không bị sai lệch , việc thực hiện
xác nhận resource đuợc thực hiện bởi CPU, do đó dẫn tới việc hao tốn tài
nguyên của CPU.
Caps bits ( Hardware capabilities )
Từ Dx9 trở về trước ,các game/ứng dụng muốn nhận ra được các feature
của card ( hay còn gọi là caps bits ) các nhà làm game phải thiết lập code
paths .Do có rất nhiều series card, mỗi loại series các nhà hardware
vendor chọn các feature riêng cho từng loại card ,ngoài ra 2 hãng Ati và
nVidia đều có những feature riêng .Việc này dẫn đến việc thiết lập code
paths rất tốn thời gian ,những dòng card cũ sẽ không đựơc viết code paths
> do đó những vid cũ ko đc các ứng dụng/game support.
Từ Dx10 việc thiết lập code path này các nhà làm game không cần thực
hiện nữa ,họ chỉ cần sử dụng các feature mà directx có để thực hiện game
của họ mà không cần quan tâm về phía hardware vendor. Những vid nào
có feature chạy được game của họ thì khi chạy game các feature này sẽ
thể hiện ra ,những vid không có thì các feature đó sẽ không có.
Những bản Directx sau : 10.1 ,10.2 sẽ đưa 1 số feature mới vào (
những feature này có thể đã có ở những card đã sản xuất trước đây ,hoặc
chưa có ) từ đó các nhà hardware vendor sẽ phát triển theo để có thể chạy
được những feature này, các nhà làm game sẽ đưa những feature này vào
game .
Giải pháp cho các giới hạn này :
- Để giảm sử dụng tài nguyên của CPU : Dx10 có 1 số feature giúp giảm
thiểu việc sử dụng tài nguyên của CPU như: texture arrays, predicated
draw and stream out.
- Thêm vào đó việc thay đổi trong việc xác nhận resource cũng giảm nhẹ
cho CPU ,thay vì resource sẽ được xác nhận mỗi khi vật được dùng trong
frame thì ở dx10 việc xác nhận resource đựơc hoàn tất khi vật thể được
tạo ra, điều này có nghĩa là vật thể được tạo ra 1 lần thì việc xác nhận
resource cũng chỉ được thực hiện 1 lần.
The DirectX 10 Pipeline:
Graphic pipeline của dx 10
Như đã nói ở trên trước đây graphic pipeline được chia làm nhiều phần :
pixel shader pipeline , vertex shader pipeline …. ( khi ứng dụng đòi hỏi
vẽ 1 hình sẽ truyền thông tin đến vid card, vid card tiếp nhận thông tin ,bộ
xử lý vertex sẽ dựng nên hình ảnh của vật đó trên màn hình, trong khi bộ
xử lý pixel shader làm nhiệm vụ cho các hình ảnh đó màu sắc ) Ở Dx10
pipeline thì không còn phân biệt ra pixel pipeline hay vertex pipeline mà
hợp chung thành unified pipeline và bộ xứ lý chúng cũng đều giống nhau
,nhờ việc này giúp giải quyết vấn đề thắt cổ chai do như đã nói ở trên.
Bước xử lý thông tin vào ( input assembler ) và Vertex Shader:
Input assembler ( IA ) là nơi mà thông tin sẽ đi vào graphic pipeline, nó
sẽ thu thập những thông tin 1 chiều về vertex trong những thông tin đi
vào nằm trong vertex buffer, sau đó chuyển thành thông tin dưới dạng 32
bit Floating point ( với các dx trước đây là 16 bits ) ,việc tăng số bits lên
giúp cho việc tính toán chính xác từ đó dẫn đến hình ảnh đẹp hơn. Sau đó
các thông tin về vertex sẽ được phân loại theo 16 yếu tố ,những thông tin
giống nhau sẽ di chuyển theo hướng cùng nhau trong IA.
IA còn có khả năng đưa các vật đã được sao chép đến tất cả các phần của
pipeline ,điều này cũng có ở dx 9 tuy nhiên những vật đc sao chép là hoàn
toàn giống như vật gốc ,còn với dx 10 những vật sao chép có hình dạng
đã được biến đổi từ vật gốc.
Như đã nói ở trên texture arrays là tính năng mới của dx 10, nó cho phép
các developer chứa lên đến 512 loại texture vào trong 1 array, và lên đến
128 texture trong 1 array bất kì gắn với shader độc lập. Ngoài ra độ phân
giải của texture cũng tăng lên ( 8192x8192 so với 4096x4096 của dx 9 ).
Texture arrays thể hiện trong quá trình dán các texture :
+ Việc dán nhiều lớp texture ( multi-texture ) ko cần đến sự hỗ trợ của
CPU nữa
+ Cho phép dán các texture trên các vật sao chép từ vật gốc. ( các vật
trong dx 10 ko chỉ khác nhau về hình dạng mà nhờ có texture arrays còn
khác nhau về màu sắc )
Vertex shader 4.0 hỗ trợ thay đổi hình dạng chất liệu và hiệu ứng trên
từng vật nhờ vào việc thiết lập 1 chương trình shader phức tạp. Ví dụ :
những cái cây trong dx 10 sẽ được thể hiện khác nhau về hình dạng cây,
màu sắc, chất liệu của cây, và những hiệu ứng.
Hình trên thể hiện sự khác nhau ở các cây mà không gặp ở dx 9
Geometry Shader:
Trong dx10 có 1 giai đoạn trong shader pipeline được giới thiệu đó là
Geometry shader, những hình thô ban đầu do giai đoạn vertex shader thực
hiện sẽ được sử dụng như thông tin của giai đoạn geometry shader ,từ đó
nó có thể được taọ ra mới, biến đổi những hình có sẵn. Nhờ khả năng
biến đổi thông tin trên, khi xuất ra từ quá trình này thì thông tin vertex
được xuất ra với số lượng nhiều hơn hoặc ít hơn ban đầu và không cần sợ
hỗ trợ của CPU.
Geometry shader có khả năng sử dụng kĩ thuật displacement mapping
cùng với kĩ thuật tessellation ( ở dx 9 không có kĩ thuật tessellation và
việc xử dụng displacement mapping rất hạn chế ) nhờ đó bề mặt của các
vật thể ( khuôn mặt hoặc mặt đất ) được thể hiện 1 cách chi tiết và
giống thật hơn.
Hình phía trên là mặt đất đã được áp dụng kĩ thuật displacement mapping
và tessellation.
Giải thích sơ vể 2 kĩ thuật này :
+ Displacement mapping là kĩ thuật dán texture, tuy nhiên nó dùng height
map để tạo nên hiệu ứng lồi lên ở trên mặt phẳng, ngoài ra trên miếng dán
này còn tính toán trước các điểm bị che khuất, để không phải vẽ nó lên,
tính toán trước bóng của các điểm lồi lên.
+Tessellation là kĩ thuật điều khiển nhiều polygon sau đó chia nó ra thành
những cấu trúc thích hợp cho việc render.
Ngoài ra, Geometry shader còn có thể truy cập vào những thông tin nối từ
vertex data ( thông tin nối là tập hợp các thông tin của các vertice gần
nhau và thông tin về sự tương tác của chúng ), nhờ việc sử dụng những
thông tin đó GPU có thể tính toán để tạo ra những hình ảnh như thật. (
lông thú, bóng của vật, giả lập các hình ảnh của hiện tượng tự nhiên : lửa
cháy, khói bốc lên, vật bị nổ, tia chớp, lá rơi, sương mù, mây, tuyết rơi
).
Stream output :
Đây cũng là 1 tính năng quan trọng của dx 10 trong graphic pipeline, tính
năng này cho phép vertex shader và geometry shader ghi thông tin trực
tiếp vào frame buffer memory ở giữa pipeline, nhờ vào việc này những
vật được nhân lên ở giai đoạn vertex shader và geometry shader sẽ quay
ngược lại để được vẽ lại 1 lần nữa mà ko cần sự giúp đỡ của CPU.
Sự phối hợp giữa Stream output với Geometry shader, cho phép áp dụng
các thuật toán về đồ hoạ mới khi thể hiện những hiệu ứng vật lý.
Đây là đoạn demo R600 của Ati :
Ví dụ để mô tả hình ảnh nổ trong đoạn demo trên ( các bạn chú ý đoạn
Ruby bị bắn nổ miếng ván trượt dưới chân ), ban đầu khói được tạo ra từ
vụ nổ, sau đó nhờ vào Geometry shader mà hiệu ứng này được nhân lên,
tiếp đó thông tin được chuyển vào frame buffer nhờ stream output để
quay ngược lại vertex shader ( tính toán cho sự chuyển động của khói ).
Sau đó, geometry sẽ giảm các thông tin ( minimication ) 1 cách từ từ, do
đó khói sẽ tan dần đi cho đến khi biến mất hoàn toàn. ( trước đây để làm
như vậy, GPU cần sự hỗ trợ rất nhiều từ phía CPU )
Predicated rendering:
-Những vật thể trong 1 cảnh 3D thường xuyên che lấp lẫn nhau dẫn đến
việc tiêu tốn nhiều resource ở những GPU hiện nay đều hỗ trợ tính năng
per-pixel Early Z cull, tính năng này giúp test trứơc các giá trị Z của các
pixel để định vật nào nằm trước hay nằm sau sau đó định ra vât nào được
xuất ra màn hình vật nào không tuy nhiên với kĩ thuật này thì đôi khi việc
tạo nên những đường vẽ dư thừa vẫn xảy ra.
Ở Dx 10 MS đề ra 1 tính năng mới đó là Predicated rendering là 1 sự phát
triển từ tính năng Early Z . Tính năng này cho phép các nhà thiết kế vẽ 1
vật phức tạp từ các hình hộp đơn giản, nếu như trong hình vẽ cuối cùng
không thể hiện được trên màn hình ( do ở 1 hướng khác không nhìn thấy
được ) thì trong cái hộp đó không vẽ vật phức tạp bên trong đó không
được vẽ lên ( xem hình ) . Ở dx9 thì việc xét xem vật đó có nên được vẽ
ra hay không được vẽ ra cần cả CPU và GPU thực hiện ,nhưng ở dx10 chỉ
có GPU làm việc này thôi.
Resource của Dx10
Như đã nói ở trên ở Dx9 resource bị giới hạn thì ở Dx10 số lượng
resource để tạo nên 1 hình ảnh 3D nhiều hơn dx9 gấp hàng trăm lần .
Shader Model 4.0
Dưới đây là bảng so sánh giữa SM 1.1,2.0,3.0 và 4.0
Kết luận :
Những điều lợi từ Dx10 là sẽ giúp cho những nhà làm game thực hiện
được những hiệu ứng ,những hình ảnh giống thật hơn ,giúp CPU giảm tải
trong việc thực hiện các ứng dụng đồ hoạ .Tuy nhiên cũng có những bất
lợi cho gamer là muốn thưởng thức được những game support dx10 phải
tốn 1 khoản tiền khá lớn không phải chỉ là khoản tiền để mua vid support
dx10 mà phải chi vào 1 hệ thống chạy tốt trên Vista ( vì dx10 chỉ có trên
hệ điều hành vista thôi )
Những vid card support dx9 vẫn có thể hoạt động trên 1 game dx10 tuy
nhiên nó sẽ gây 1 gánh nặng lớn trên CPU do đó sẽ giảm performance
của game . Tuy nhiên đây chỉ là lý thuyết còn thực tế thì phải đợi 1 game
dx10 ra rồi mới có thể kiểm chứng được.
Hiện tại 1 số game nổi tiếng đang tìm cách ứng dụng dx10 vào game của
mình như nreal Tournament 2007, Hellgate: London, Microsoft’s Flight
Simulator X .
Bài trên đây dịch từ nguồn _-
tech.net/hardware/2006/11/30/directx10_future_of_pc_gaming/6.html .
Rock không phải chuyên ngành về đồ hoạ nên có những điểm dịch còn
sai sót ,dịch chưa tới nên nếu ai cần biết rõ hơn thì nên đọc lại bài trên và
góp ý dùm .Bài post đây mang tính chất thảo luận nên mọi người cứ tự
nhiên đóng góp những gì mình biết về dx10.