Nghiên cứu và xây dựng thử nghiệm với 3d engine
Trang 1TÀI LIỆU THAM KHẢO
directX 9.0 sdk Update Summer 2004, Microsoft, 2004.
Jake Simpsom Game Engines Anatomy 101, April 12,
2002.
Bendik Stang, Game Engines, IMMDTU, 2003.
David H Rberrly, 3D Game Engine Design, Morrgan
Trang 2 Evan Phipho, Focus on 3D Models, Premier Press Fame Development, 2003.
Jim Adams, Programming Role Playing Game With DirextX Premier Press Game Development, 2002.
maco monster, Doom3 Models, September, 2004.
Trang 3CH ƯƠNG I: GIỚI THIỆU VỀ NƠI THỰC TẬP
Trường trung học phổ thông Kỹ Thuật Việt Trì được thành lập ngày 03/7/2003 Là một trường nằm trong hệ thống các trường trung học phổ thông công lập tỉnh Phú Thọ Những ngày thành lập trường mới có 18 cán bộ giáo viên công nhân viên với 180 học sinh, sau gần 4 năm đội ngũ cán bộ giáo viên công nhân viên của nhà trường đã phát triển mạnh mẽ về số lượng và chất lượng, năm 2007-2008 trường có 44 cán hộ giáo viên công nhân viên với gần
500 học sinh
Qua hai năm học 2006-2007, 2007-2008, trường có 12 lớp ( bao gồm 04 lớp khối 10, 04 lớp khối 11, 04 lớp khối 12) Tuy có nhiều khó khăn nhưng nhà trường đã tổ chức tốt việc dạy và học Kết quả có 12 học sinh giỏi cấp tỉnh các môn: ngữ văn, hoá học, vật
lý lịch sử, Tin học.
Được sự quan tâm của tỉnh uỷ hội đồng nhân dân tỉnh ,UBND tỉnh Phú Thọ của sở Giáo Dục Đào Tạo trường được cấp vốn xây dựng đợt một, dự kiến học kỳ hai năm học 2008-2009 sẽ có một ngôi trường công lập với quy mô 30 lớp hiện đại khang trang nhất trong cả nước tại thôn Thậm Thình xã Vân Phú Thực hiện chương trình thí đua thay đổi nội dung, phương pháp giảng dạy tiên tiến của khối trung học phổ thông Đáp ứng nhu cầu học tập ngày càng cao của học sinh khu vực phía bắc thành phố Việt Trì và các xã lân cận thuộc huyện Phù Ninh, Lâm Thao
Là một trường vừa dạy chương trình văn hoá phổ thông vừa dạy nghề với mục đích học sinh ra trường vừa có bằng trung học phổ thông hệ chính quy vừa có bằng tay nghề bậc 2/7 vì thế chương trình dạy nghề rất nhiều mà công nghệ thông tin là một trong những nghề được học sinh yêu thích và đăng ký nhiều nhất
Chương trình đào tạo nghề như sau:
lớp 10: 4 tiết /1 tuần.
lớp 11: 8 tiết /1 tuần.
Lớp 12: 5,5 tiết/1 tuần.
Trang 4Vì sau khi ra trường học sinh chỉ nhận bằng tay nghề bậc 2/7, trong khi đó các công ty, các cơ sở tuyển dụng yêu cầu với tay nghề bậc 3/7 vì thế, nhà trường đã liên kết với các trường và trung tâm dạy nghề Đào tạo tiếp các em có nhu cầu sau khi tốt nghiệp cần học thêm để lấy tay nghề cao hơn phục vụ cho công việc sau này.
Trang 5CHƯƠNG II: GIỚI THIỆU VỀ ĐỀ TÀI THỰC TẬP
2.1 Lý do chọn đề tài: “nghiên cứu và xây dựng thử
nghiệm với 3d engine”
Ngày nay, các sản phẩm giải trí mà đặc biệt là game đã mang lại một nguồn lợi nhuận to lớn cho ngành công nghiệp máy tính Do nhu cầu của thị trường tăng nhanh, các game ngày càng có chất lượng cao và thời gian xây dựng ngày càng được rút ngắn Các game 3d trên thị trường hiện nay rất đa dạng về nội dung và chủng loại nhưng cùng có điểm chung là xây dựng trên các game engine Chất lượng của game sẽ phụ thuộc vào chất lượng của game engine
mà nó sử dụng.
Game engine chính là phần cốt lõi để xây dựng game hiện nay
và 3d engine chính là phần quan trọng nhất của game engine Việc
sử dụng game engine để xây sựng game là một xu thế tất yếu để có những game chất lượng cao trong thời gian ngắn Tiếc thay Hiện nay ở nước ta việc xây dựng game 3d cũng như game engine vẫn còn là điều mới mẻ Chính vì vậy, em thực hiện đề tài “ nghiên cứu
và xây dựng thử nghiệm 3d engine” với mong muốn góp vào những viên gạch đầu tiên để xây dựng nên ngành công nghiệp game của nước nhà trong tương lai.
Thực hiện đề tài này em muốn giới thiệu với các thầy cô giáo trong trường trung học phổ thông kỹ thuật việt trì, cũng như các em học sinh một công nghệ làm game 3d mới Em hi vọng rằng sau khi xem song đề tài này những em học sinh trong trường sẽ có một cách nhìn khác về lập trình game và biết đâu trong số những học sinh đó
sẽ trở thành lập trình game chuyên nghiệp trong tương lai, đưa game việt nam có một vị trí tương đối trong làng game thế giới.
2.2 L ịch sử phát triển game engine
Game engine', thuật ngữ đã trở nên quá quen thuộc đối với những người mê game trong những năm gần đây, là một thành phần tối quan trọng không thể thiếu trong việc phát triển trò chơi ngày nay.
Với cấu trúc cồng kềnh và ngày càng trở nên tinh vi của các
Trang 6trò chơi, nếu không có sự hỗ trợ của game engine, các nhà phát triển lẫn phát hành thường sẽ phải đối mặt với những thử thách nguy hiểm: thời gian phát triển game kéo dài, chi phí tăng vọt, chưa kể các rắc rối phát sinh Một ví dụ đơn cử: khi gas powered games thực hiện dungeon siege (ra mắt năm 2002), họ không có trong tay một game engine nào cả và để thực hiện được trò chơi này, mọi thứ (kể
cả việc xây dựng engine cho game) phải làm từ đầu, kết quả là hãng phát triển game của chris taylor phải mất ròng rã ba năm để hoàn tất trò chơi Trong khi đó, firaxis chỉ cần thuê engine gamebryo và họ tốn chưa tới hai năm để hoàn thành sid meier’s pirates.
Theo từ điển bách khoa toàn thư wikipedia, game engine là một bộ công cụ phần mềm, tập hợp của nhiều yếu tố như: cơ chế dựng hình (2d hoặc 3d), hệ thống vật lý, ai, âm thanh Cho phép trò chơi chạy trên nhiều nền tảng khác nhau, với việc sử dụng được đơn
Vào đầu thập niên 90 (và trước đó nữa), việc thực hiện trò chơi rất
dễ dàng, mau chóng bởi yêu cầu về hình họa và lối chơi vô cùng giản đơn Cũng chính vì quá đơn giản, nên phần lớn những nhà phát triển game thời bấy giờ chưa có được một khái niệm hay định hình
về “game engine” Tại sao phải phức tạp hóa một dự án game vốn chỉ cần vài người đảm trách cùng lúc nhiều vai trò khác nhau? Trò chơi nhập vai lừng danh một thuở của interplay, stonekeep, là điển hình của sự tư duy kiểu cũ này Theo dự tính, game chỉ cần 9 tháng
là hoàn thành, với ngân quỹ vào khoảng 50.000 usd và chỉ mất có Hai người để thực hiện.
Tuy nhiên, không ai ngờ tới khi công nghệ máy tính đột ngột chuyển mình mạnh mẽ trong giai đoạn 1992-1995, thị hiếu thị trường cũng thay đổi theo và điều tất yếu là sự phức tạp trong việc phát triển trò chơi tăng nhanh khó đoán Stonekeep, một “nạn nhân” của việc không phòng bị trước – chỉ có độc mỗi engine đồ họa thô
sơ, đã phải loay hoay nâng cấp dự án của mình: rót thêm 5 triệu usd kinh phí, nâng số nhân viên lên hơn 200 người và mất 5 năm mới ra mắt (vào năm 1995).
Trong khi đó ở cùng thời điểm, id software với khả năng “nhìn
Trang 7thấu tương lai” đã chuẩn bị trước cho mình một bộ công cụ tích hợp
đủ tính năng, đáp ứng được nhu cầu thị trường lúc bấy giờ là wolfenstein 3d engine, và lẽ tất yếu thành công không nằm quá tầm tay họ Điều quan trọng nhất thời điểm đó là id software đã đặt nền tảng cho khái niệm một “game engine” đúng nghĩa: tập hợp nhiều thành phần cần thiết cho việc xây dựng một trò chơi, giảm tải chi phí, thời gian và nhân lực phát sinh.
Sau wolfenstein 3d (1992), một kỷ nguyên fps ra mắt, thúc đẩy thêm nhiều cải tiến vượt trội đối với game engine và bắt đầu lấn sân sang các thể loại game khác Giờ đây, tuy có nhiều kiểu game engine khác nhau, nhưng tựu trung khi nhắc đến cụm từ này, người
ta vẫn xem thể loại fps là một “biểu tượng” đặc trưng, thể hiện rõ nét nhất hai chữ: game engine.
Song song với giai đoạn hoàn thiện bản thân, thì game engine còn được khai thác ở một khía cạnh khác là kinh tế Chúng được thương mại hóa bằng cách cho thuê Việc cho thuê này sẽ giúp người đi thuê tiết kiệm được chi phí và thời gian làm game: họ chỉ việc lấy engine đó về và “đắp da, đắp thịt” cho phần nội dung game (đồ họa, nhân vật, vũ khí và màn chơi) dựa trên khung sườn có sẵn Với người cho thuê, có trong tay một số tiền sẽ giúp họ có kinh phí thực hiện các dự án khác hoặc nâng cấp cho engine hiện tại của mình Một engine có thể cho nhiều hãng phát triển game thuê cùng lúc và tùy theo nhu cầu, nó có thể được chỉnh sửa Giá cả thuê sẽ xê dịch khác nhau tùy theo chất lượng và tên tuổi của engine đó, chẳng hạn khi warcraft iii ra mắt thành công (2002), engine thực hiện game này đã được “hét giá” trên thị trường lúc đó vào khoảng 4 triệu usd.
Đi đầu và sớm nhất trong việc nắm bắt thị trường thuê game engine, có thể kể đến hai tên tuổi lẫy lừng: quake iii arena (id software) và unreal tournament (epic games) Cả hai gần như “thống trị” thị trường giai đoạn 1999 – 2002, phần lớn game ra mắt lúc đó thay phiên nhau sử dụng một trong hai engine này làm nền tảng Khi half-life 2 ra mắt vào năm 2004, giới thiệu engine source đến với mọi người thì cả hai engine kia đã bước sang thế hệ thứ hai, và thị
Trang 8trường giai đoạn 2004 – 2006 chứng kiến thế chân vạc phân chia giữa id software, epic games và valve corporation.
Cuối thời điểm 2006, khi thế hệ console “next-gen” rộ lên thì cũng là lúc epic games đưa ra một quyết định táo bạo: tấn công vùng đất mới này! Kết quả là họ cho ra mắt engine unreal 3 – hỗ trợ nhiều công nghệ hiện đại, bao gồm cả directx 10, với sản phẩm đình đám gears of war (xbox 360) Thông qua cuộc bứt phá ngoạn mục này, epic đã bỏ rơi hai đối thủ đáng gờm lại phía sau một bước: valve thì vẫn giậm chân tại chỗ, không thêm thắt cải tiến, trong khi
id software lật đật nghiên cứu và trình làng thế hệ engine mới (id tech 5), dù chưa có sản phẩm ứng dụng nào có mặt trên thị trường Tính đến thời điểm này, hiện danh sách các game sử dụng engine unreal 3 đã vượt hơn con số 60 và sẽ còn tiếp tục được thêm vào, bỏ
xa source ở vị trí thứ nhì (tầm 30 game) và rất, rất xa so với engine doom 3 (id tech 4) chỉ chưa đầy chục game ứng dụng.
2.3 Các công cụ thiết kế game engine
2.3.1 Eng ine unreal 3
Để đạt đến thành công như ngày hôm nay, engine unreal 3 phải
có trong người “võ công” thuộc hàng thượng thừa trong giới Theo tương truyền thì unreal 3 có tới 17 bí kíp võ công khác nhau, nhưng tựu trung lại thì hướng vào ba ý chủ đạo, đó là:
- thiết kế mô hình hướng đối tượng với ngôn ngữ c++ làm nền, dễ dàng làm việc trên các hệ điều hành khác nhau, ở bất cứ nơi đâu.
- người sử dụng sẽ là đối tượng được phục vụ chính, với nhiều bộ công cụ và tiện ích hỗ trợ mạnh mẽ, có thể làm được bất cứ gì dựa trên ý tưởng sáng tạo của mình.
- có thể được sử dụng để phát triển game trên nhiều hệ máy khác nhau, dễ nâng cấp, thêm thắt các đoạn mã, plug-in khác nhau Những tính năng đáng chú ý của unreal 3
scripting (lập trình mã)
Unreal 3 sử dụng bộ mã riêng của mình để lập trình có tên là unrealscript Bộ mã này được xem là gần gũi do được viết trên ngôn ngữ c++, dễ dàng tương thích với các bộ mã nguồn khác nhau Có
Trang 9thể tương tác với trình unrealed có sẵn để tạo nên lối chơi, thiết kế màn chơi của game một cách dễ dàng.
Ngoài ra, công cụ visual ai scripting tool còn giúp cho lập trình viên rất nhiều trong việc thiết kế nhiệm vụ, các sự kiện đặc biệt trong game và trí thông minh của máy
Physics (các hiệu ứng vật lý)
Engine hỗ trợ 4 cơ chế vật lý là basic physics (hiệu ứng vật lý
cơ bản), collision detection (phụ trách mảng va chạm, cháy nổ sẽ xảy ra trong game), rigid body (vật lý từng phần, phụ trách các hiệu ứng như rag-doll, tháo rời từng mảnh ) và vehicle physics (tương tác giữa nhân vật và các phương tiện cơ giới khác, a.i )
Texturing (vân bề mặt)
Hỗ trợ hầu hết các cơ chế phủ vân bề mặt tiên tiến như basic, multi-texturing, bumpmapping (tạo hiệu ứng bề mặt sần sùi), mipmapping, volumetric, projected, procedural.
Animation (chuyển động vật thể)
Trang 10Với các cơ chế inverse kinematics, keyframe animation, skeletal animation, facial animation, animation blending Đặc biệt,
cơ chế dựng skeletal animation (chuyển động khung xương) được
hỗ trợ tốt với bốn khớp xương được thể hiện trong một vertex (đỉnh) Ngoài ra, engine còn tương thích với nhiều chương trình dựng hình nổi tiếng như 3d studio max, maya
Meshes (mô hình lưới)
Để dựng được một mô hình, bạn phải bắt đầu từ việc vẽ các điểm ảnh, sau đó nối các điểm ảnh này với nhau để tạo thành những mắt lưới Càng nhiều mắt lưới thì mô hình càng chi tiết Unreal 3 hỗ trợ các hiệu ứng như mesh loading, skinning, progressive,
Các mô hình thường được dựng trên hai lớp lưới: đó là realtime mesh (mô hình lưới thực), với hàng ngàn đa giác ảnh trên đó và detail mesh (mô hình lưới chi tiết) với hàng triệu đa giác.
Các hiệu ứng đặc biệt
Tập trung đủ các hiệu ứng thời thượng hiện nay như environment mapping, lens flares, billboarding, particle system, depth of field (tạo hiệu ứng chiều sâu tầm nhìn), motion blur (hiệu ứng nhòe hình khi vật chuyển động), sky, water, fire, explosion, decals (vết đạn dính trên vật thể), fog, weather, mirror (gương).
Terrain (địa hình)
Người sử dụng có thể dựng địa hình với nhiều lớp (layer) riêng biệt được xếp lên nhau, dễ dàng tạo nên những khung cảnh, môi trường rộng lớn với độ chi tiết cao Ngoài ra, engine còn cho phép thêm các hiệu ứng thời tiết, mùa màng vào địa hình như: cỏ cây, hoa lá dính trên đá, cánh đồng tuyết trắng xóa
Hệ thống mạng
Hỗ trợ trên nhiều hệ máy, nhiều hệ điều hành với số lượng người chơi ở mức 64 Dễ dàng cho người dùng chỉnh sửa và thêm thắt nhiều tiện ích khác nhau cho mục chơi mạng của game.
Âm thanh
Trang 11Âm thanh nổi, vòm, 3d chất lượng cao, có sẵn bộ công cụ để biên tập và chỉnh sửa.
Trí thông minh nhân tạo
Với bốn cơ chế hỗ trợ là pathfinding (khả năng nhận biết đường đi), decision making (xử lý tình huống), finite state machines, scripted (tự chỉnh sửa và lập trình cho a.i).
Rendering (kết xuất đồ họa – dựng hình)
Hỗ trợ dựng hình high dynamic range trên cơ chế 64 bit với độ phân giải cao, hỗ trợ luôn cả các hiệu ứng post processing như: light blooms, lenticular halos, hay depth-of-field Dễ biên tập theo ý thích của người sử dụng.
2.3.1.1 Thể hiện ánh sáng rất hiệu quả
Nếu như trong rainbow six vegas, khung cảnh đa phần là những khu vực rực rỡ ánh sáng của mặt trời, của đèn điện đủ màu sắc chiếu rực cả một thành phố las vegas về đêm, thì ngược lại trong bioshock, khung cảnh lại là một thành phố dưới đáy biển tối tăm và
ẩm thấp Cả hai game đều thể hiện rất tốt các luồng ánh sáng, tạo nên những khung cảnh hài hòa, phù hợp với xu hướng chủ đạo của game Còn với “siêu phẩm điện ảnh” stranglehold của đạo diễn ngô
vũ sâm, dấu ấn ánh sáng cũng rất rõ nét với những cảnh trong nhà
và ngoài trời được dựng vô cùng chân thật, tạo nên một khung cảnh nền sống động với những cảnh phim “đẹp mê ly” hệt như trong các siêu phẩm anh hùng, ngọa hổ tàng long hay thập diện mai phục Trong khi đó, gears of war lại mang “hơi hướng” của những thước phim hành động phương tây với tông màu bàng bạc của khói và bụi.
Trang 12Và cũng chính nhờ hiệu ứng ánh sáng, thể hiện mặt nước trở nên thật hơn, đặc biệt là trong bioshock Các hiệu ứng của nước được dựng rất công phu, thêm nữa là việc nhúng các hiệu ứng của directx 10 vào làm cho tương tác với mặt nước không còn chỉ là các vân (texture) đắp lên bề mặt nữa, mà giờ đây đã mềm mại hơn rất nhiều.
2.3.1.2 Khả năng tương tác vật lý rất tốt
Bioshock là một thí dụ điển hình cho khả năng này Với siêu năng lực, người chơi có thể tương tác với vô số các vật thể bằng nhiều cách khác nhau: từ di chuyển đến đốt cháy hay va đập đều thể hiện rất ấn tượng Hay như trong medal of honor: airborne, một điểm tiến bộ là phát đạn sượt qua đầu có thể “mượn tạm” cái mũ của kẻ thù Giờ đây cái nón không còn là một phần dính liền của vật thể hình ảnh, mà nó có thể dễ dàng tương tác được Cách giải quyết vật lý trong stranglehold lại cho thấy tính linh động của unreal 3 khi
có đến ba engine vật lý khác nhau được sử dụng: physx của ageia được tích hợp mặc định, havok để xử lý các tương tác vật lý thông thường, massived được midway dựng riêng phục vụ cho ý đồ phá hủy hàng loạt của trò chơi Giờ đây, những vật cản như cột bê tông, thùng gỗ, vách tường Không còn là nơi trú ẩn an toàn cho các game thủ Tất cả đều dễ dàng bị thổi tung mất dạng.
2.3.1.3 Phủ vân bề mặt tạo nên những mô hình cực kỳ
chi tiết.
Dễ thấy nhất là qua gears of war, khi mô hình các nhân vật vô cùng sống động đến từng đường nét khuôn mặt Bioshock cũng không hề kém cạnh khi thể hiện những big daddy nặng nề và chậm chạp, chi tiết đến từng chỗ rỉ sét trên bộ đồ lặn cũ kỹ.
2.3.1.4 Snap-to-cover
Một chức năng khá lý thú của phần nhiều các game sử dụng unreal 3 là “snap-to-cover” (khả năng ẩn nấp) Khi ẩn nấp, góc nhìn
Trang 13chơi có tầm quan sát bao quát hơn và có thể thấy được độ chi tiết của nhân vật mình điều khiển
Bên cạnh những ưu điểm được thể hiện, các game sử dụng unreal 3 vẫn còn tồn tại khá nhiều khuyết điểm Việc phủ các vân bề mặt (texture) chi tiết cũng là một “con dao hai lưỡi” khiến cho việc
xử lý trở nên nặng nề hơn Với một số game như bioshock và medal
of honor: airborne, tốc độ nạp các texture không kịp sẽ gây ra hiện tượng mất vân bề mặt khi vừa nạp màn xong Hay tệ hơn nữa, trong bioshock có thể gây ra lỗi “kẹt” các texture, làm mất màu hoàn toàn hoặc một bộ phận nào đó của màn chơi.
Trong khi đó, với cơ chế vật lý “hạng nặng”, các game cũng đem lại những bất hợp lý Với rainbow six vegas, các mô hình nhân vật đều có thể tương tác vật lý được, tuy nhiên, sau khi bị bắn hạ thì lại mất hoàn toàn yếu tố vật lý, có thể nằm vắt vẻo Xuyên qua vật thể! Đối với medal of honor: airborne thì mọi việc còn tồi tệ hơn nữa: các mô hình nhân vật rất dễ biến dạng một cách kỳ quái Chẳng hạn, ở màn market garden thường xuất hiện các “quái vật cổ dài”, theo nguyên tắc vật lý của engine thì phần đầu khi bị bắn trúng phải đứt rời ra, nhưng giờ đây “dính lại”, tạo thành một hình ảnh hết sức khôi hài Hay một hiện tượng khác là việc các mô hình nhân vật bị
“thổi bay” một cách thái quá dưới sức ép của vụ nổ Dường như các nhân viên của ea đã “giảm cân” tối đa cho các nhân vật của mình, khiến chúng nhẹ tênh như giấy vậy.
Ánh sáng là một ưu thế của unreal 3 nhưng cũng lại mang khuyết điểm trong việc đổ bóng Nếu một người lính trong medal of honor: airborne đứng gần một bức tường, thì lập tức sẽ xuất hiện hai bóng trên bức tường và Phía bên kia tường Ngay cả trong bioshock cũng gặp phải lỗi tương tự.
Một nền tảng tốt
Nhưng cần phải trau chuốt Đặc điểm của các game thể hiện trên nền unreal 3 là có khá nhiều lỗi vụn vặt giống nhau như lỗi đổ bóng, lỗi thể hiện vật lý Cộng với một cơ chế cồng kềnh bất hợp
lý làm cho cấu hình đòi hỏi của các game khá nặng Tuy nhiên, thể hiện hiện tại của unreal 3 trên các game đã phát hành là rất ấn tượng! Sản phẩm đã tạo ra một môi trường làm việc rất tốt, tích hợp
Trang 14đầy đủ các tính năng mạnh mẽ để những nhà phát triển tự do phát huy ý tưởng sáng tạo của mình Trong tương lai, có thể epic sẽ cho
ra đời hệ thống chỉnh sửa unreal tournament 3 như đã từng làm với phiên bản 2004, cho phép game thủ can thiệp sâu vào nội dung của game.
Với những ưu điểm nổi trội như vậy, sẽ không có gì đáng ngạc nhiên khi engine unreal 3 ngày càng trở nên thu hút sự quan tâm của giới phát triển trò chơi và ngày càng có nhiều game “đỉnh” ra mắt cộng đồng game thủ Có thể ví von engine này giống như những nguyên liệu tốt, rất cần thiết để chế biến ra một món ăn ngon, mặc
dù các đầu bếp tài hoa phải thật khéo tay để nhặt cho kỳ hết những hạt sạn còn tồn tại
Cạnh tranh với engine unreal 3 hiện nay trong thể loại fps là
vô số các engine của nhiều game khác nhau Tuy nhiên, để được gọi
là bộ engine “hoàn chỉnh” – tích hợp đầy đủ tính năng như unreal 3 thì chỉ đếm được vài con số trên đầu ngón tay Có thể kể vài engine tiêu biểu như:
2.3.2 Source engine
Ra đời vào 10/2004, được phát triển bởi valve corporation dựa trên engine goldsrc cũ (engine này được xem là một bản “mod” (hiệu chỉnh) từ engine quake của id software) Một đối thủ khá khó chịu của unreal 3 Nếu nói về những điểm mạnh của source thì có thể kể ra vô số Đầu tiên, một sự thật không ai có thể phủ nhận là khả năng hỗ trợ vật lý cực tốt (ví dụ cụ thể nhất là khẩu súng trọng lực của gordon freeman trong half-life 2), hỗ trợ hiệu ứng lip-sync cực chuẩn Kế đến là cấu hình yêu cầu đối với những tựa game sử dụng source khá nhẹ, điều kiện cần cho các game thi đấu Thứ ba, source rất dễ nâng cấp và sửa lỗi với nhiều tính năng, hiệu ứng mới
ở từng phiên bản một Đồng thời, khả năng hỗ trợ cộng đồng mod thuộc hàng thượng thừa Tuy nhiên, về khoản cháy nổ, máu me thì source thật khó mà so được với unreal 3!
Trang 15Id tech có nhiều phiên bản Bắt đầu từ phiên bản đầu tiên có tên gọi là doom engine, xuất hiện cùng lúc với trò chơi doom nổi tiếng Sau đó, id tech 2 ra đời với tên quake engine, tất nhiên kèm theo đó là trò chơi quake của hãng Tiếp theo là id tech 3 xuất hiện trong quake iii arena Vào thời bấy giờ thì id tech 3 được xem là đối thủ trực tiếp với unreal engine Engine này cũng được sử dụng để thực hiện nhiều game khá nổi tiếng, trong đó có call of duty, medal
of honor: allied assault Id tech 4 (hay doom 3 engine) xuất hiện đồng thời với doom iii, mang nhiều tính năng và hiệu ứng đặc biệt, nổi trội như: ánh sáng, đổ bóng hoàn hảo, vân bề mặt với độ chi tiết cao, hỗ trợ chơi mạng tốt (điển hình là trò chơi quake iv) Tuy nhiên, engine chỉ thể hiện tốt những cảnh trong nhà, còn ngoại cảnh thì kém hơn rất nhiều Hiện nay, id tech 5 vẫn đang được id software phát triển, hứa hẹn nhiều cải tiến mới, và đặc biệt là hỗ trợ
2.3.4 Cryengine
Bắt đầu từ một bản demo quảng cáo công nghệ cho card màn hình nvidia, cryengine được crytek phát triển lên thành engine cho tựa game far cry của hãng Hiện nay, phiên bản cryengine 2 đang được crytek phát triển và dùng trong trò chơi crysis sắp ra mắt của
họ Qua nhiều đoạn trailer, hình ảnh ban đầu thì cryengine 2 thực sự tạo ấn tượng với người xem thông qua những hiệu ứng hình ảnh đẹp, với độ chi tiết sắc nét Tuy vậy, trong phiên bản thử nghiệm beta chơi mạng mới tung ra gần đây của crysis, theo nhận xét của nhiều người thì game đòi hỏi cấu hình quá nặng mà hiệu quả hình ảnh đem lại cũng không có nhiều ấn tượng, vô hình chung đã “giết chết” mục chơi mạng của game.
3 Lý thuyết về game engine và 3d engine
4 Lý thuyết về game engine và 3d engine
Cùng với sự du nhập của hàng loạt ngành nghề liên quan, ngành công nghiệp phát triển game (game development) đang thực
sự tạo nên một cơn “sốt” trong giới yêu game thích sáng tạo.
Nói rằng game development mới chỉ được các bạn trẻ yêu
Trang 16game việt nam biết đến trong vài ba năm gần đây thì chưa hoàn toàn chính xác, vì thực ra đã có không ít người nghiên cứu và tìm hiểu về lĩnh vực này từ trước năm 2002 Chỉ có điều lúc bấy giờ định kiến
về tác hại của game rất nặng nề và nền tảng công nghệ thông tin – viễn thông trong nước còn non kém Cơ hội tiếp xúc với internet của đa phần giới trẻ còn là cái gì đó quá “xa xỉ” và mới lạ, nên tất cả vẫn chỉ dừng lại ở con số 0 tròn trĩnh.
Nhưng chỉ trong vài năm gần đây, từ khi game online thống lĩnh thị trường game trong nước và kéo theo nền công nghiệp game phát triển không ngừng, thì số lượng người chơi game ngày càng tăng, sự am hiểu về game ngày càng sâu sắc Và cùng với sự phát triển nhanh chóng của mạng lưới internet, những kiến thức về phát triển game du nhập vào việt nam là một tất yếu.
Phát triển game, nói một cách đơn giản là quá trình tạo ra trò chơi ngay lập tức thu hút sự quan tâm của một phần không nhỏ các bạn trẻ thích tìm hiểu Những diễn đàn game bắt đầu thành lập những khu thảo luận nhỏ như box game programming của gamevn.com, game thủ v vv Tất nhiên, ban đầu những bài viết xoay quanh vấn đề này còn lẻ tẻ, nhưng càng ngày số lượng người tham gia càng đông Và nếu như bạn đã từng theo dõi quá trình ấy, thì chắc chắn sẽ đồng ý với tôi rằng sự du nhập của 2 game engine rpg maker và game maker chính là những tác nhân đầu tiên thổi bùng lên niềm đam mê tạo game của các game thủ.
Đặc điểm của các game engine này là chúng rất đơn giản, sử dụng công nghệ 2d và hầu như ai cũng có thể dễ dàng tiếp cận sau một thời gian ngắn tìm hiểu Chính vì vậy, không lâu sau đó, hàng loạt “tác phẩm” đầu tay của những bạn trẻ không chuyên cũng đã xuất hiện trên mạng internet.
Không dừng lại ở những sản phẩm 2d đơn giản, cộng đồng phát triển game việt nam tiếp tục đi những bước tiếp theo, game 3d
“made in vn” Mặc dù nếu so sánh với những tựa game thương mại trên thế giới thì còn quá khập khiễng,
Game engine thực chất chỉ là 1 tập các các thư viện hàm độc
Trang 17trò khác nhau về mặt chức năng nhằm đáp ứng 1 tính năng ứng dụng game yêu cầu Ví dụ, bạn nghĩ trong đầu, mình muốn làm 1 game 3d, có âm thanh, hiệu ứng vật lý, hỗ trợ chơi qua mạng Ở mức cực kỳ đơn giản mỗi chức năng đó bạn sẽ viết 1 hay 2 lớp để
xử lý chúng ( ví dụ crenderer, csound, cphysic Cnetwork v.v ) Nhưng thường thì nếu chỉ 1 vài tính năng sẽ không thể nào đáp ứng nổi yêu cầu ngày càng mở rộng của trò chơi, bạn phải phát triển 1 chức năng thành nhiều lớp, hàm Khi khối lượng 1 chức năng khá lớn người ta thường gói lại thành những bộ thư viện (.lib hay dll)
để dễ sử dụng ( lúc này bạn có renderer.dll, sound.dll, physic.dll, network.dll ) Và cứ như thế mở rộng ra 1 chức năng có thể bao gồm nhiều dll ( ví dụ renderer.dll -> renderer_dx9.dll, renderer_dx10.dll, renderer_gl.dll v.v ), mở rộng bao nhiêu dll thì
sẽ phụ thuộc và người thiết kế và cấu trúc của thư viện Các thư viện này thường được viết hết sức độc lập với game ( để có thể dùng để viết nhiều game khác nhau, ví dụ engine source dùng để viết hl2, vampire v.v ).
Mặt khác 1 game dùng khá nhiều loại dữ liệu ( dữ liệu mesh ,
dữ liệu va chạm vật lý, dữ liệu terrain, dữ liệu các vật thể trong thế giới 3d v.v ), người ta không thể dùng tay để tạo ra tất cả các loại
dữ liệu này được, nên thường họ sẽ phát triển các tool để sử dụng 1 cách trực quan hơn Ví dụ : mô hình 3d đã có tool 3ds max xuất ra nhưng engine ko đọc được file 3ds -> người ta phải viết 1 tool đề convert định dạng file 3ds sang định dạng file mà game sử dụng, cụ thằng doom 3 có tool chuyển từ file maya mb sang md5mesh hay md5anim
Thông thường thuật ngữ game engine dùng để chỉ tập hợp tất
cả các bộ thư viện + các tool này Tùy vào game engine mà hỗ trợ các thư viện và các tool khác nhau, có thể hỗ trợ cái này mà không
hỗ trợ cái kia v.v Còn các khái niệm về 3d engine hay physic engine là để ám chỉ các bộ thư viện con của game engine Thông thường 1 hãng game khó lòng sản xuất được 1 game engine có toàn
bộ tất cả tính năng ( 3d, sound, vật lý v.v ) nên họ thường mua lại các thư viện sẳn có của hãng thứ 3 ( ví dụ unreal engine mua thư viện vật lý novodex để hỗ trợ tính năng vật lý cho unreal game
Trang 18engine ) Nói cách khác 3d engine hay physic engine mà bạn thường nghe là các thư viện con của game engine ( ví dụ thằng ogre chỉ được coi là 3d engine vì nó thiếu các tính năng khác như vật lý, network, sound, và cái thiếu nhất là các tool hỗ trợ ).
4.1.1 Game engine gồm các thành phần cơ bản sau:
• Hệ thống toán học ( math system ).
• Hệ thống xử lý tập tin dữ liệu ( file system).
• Hệ thống hiển thị đồ hoạ ( render system).
• Hệ thống quản lý diễn hoạt ( animation system ).
• Hệ thống xử lý nhập và xuất ( input and output system).
• Hệ thống xử lý các tương tác vật lý ( physics system ).
• Hệ thống xử lý mạng ( network system ).
• Hệ thống tạo hiệu ứng khác như khói lửa, âm thanh … (effect system ).
Trong các game khác nhau thì vai trò của các thành phần trên
sẽ khác nhau Thông thường xây dựng game ta chỉ cần một sổ trong các thành phần trên mà thôi Việc xây dựng và quản lý tất cả các thành phần trên của một game engine đòi hỏi một lượng lớn thời gian cũng như công sức và đôi khi đòi hỏi nhiều kỹ thuật và kiến thức của nhiều lĩnh vực khác nhau.
3d engine bao gồm một tập các hệ thống trong game engine nhằm giải quyết các vấn đề chính của đồ hoạ 3d engine nên em tập trung vào xây dựng hệ thống hiển thị và hệ thống quản lý tập tin.
Do 3d engine là một thành phần đặc trưng của game engine nên chúng ta sẽ tìm hiểu về 3d engine thông qua việc tìm hiểu về game engine.
4.1.2 Mối quan hệ giữa game engine và game
Trang 19Game engine chính là thành phần cốt lõi làm nền móng xây dựng nên game Sự khác biệt giữa game engine và bản thân game tương tự như sự khác biệt giữa động cơ và chiếc xe Chúng ta có thể đem động cơ ra khỏi xe, chỉnh sửa và dùng lại Một game engine có thể được xem như là một phần không phụ thuộc vào game, nó cũng
có thể được thay đổi độc lập với game mà không làm thay đổi cấu trúc logic của game.
4.1.3 Phân loại game engine
Các game engine này thường được sử dụng trong các
Game chiến lược ( strategy ) và trong các thể loại game nhập vai ( rpg: role game play genre) Một số game được xây dựng trên isometric engine có thể kể đến như baldur’s gate 2, diablo 2 và warlords battle cry 2.
Isometric engine không phải là một game engine tốt cho việc xây dựng các game chuyên về đồ họa 3d engine mà chỉ có một số chức năng 3d.
Trang 204.1.5 3d fps ( first person shooter ) engine
Đây là game engine dùng nhiều nhất trong các 3d game hiện nay Với sự phát triển vượt bậc về công nghệ game trong vài thập niên gần đây thì người dùng mong muốn có những game bắt mắt nhất và loại game engine này đã đáp ứng được nhu cầu đó
Một số trong rất nhiều game được xây dựng trên các 3d fps engine như: doom, quake Half life, counter strike, unreal, duke nuke’m, deusex, … 3d fps engine đã tạo ra những thay đổi lớn lao trong các engine xây dựng thực tại ảo
Các game engine này thông thường còn kèm theo các công cụ
để tạo ra các sản phẩm mang tính nghệ thuật và tương tác cao Các ứng dụng tạo ra các mô hình 3d nổi tiếng như 3dsmax, maya và softimage đều có thể kết xuất (export) kết quả vào các game engine này Các đặc trưng cơ bản của các game engine này là nó hỗ trợ nhiều chức năng như tô bóng điểm ( pixel shader ), quản lý diễn hoạt (animation), mô phỏng vật lý, mô phỏng chuyển động của cậht nhỏ ( như bụi, lửa Khói), mô phỏng chất lỏng, áo quần, và cáchiệu ứngkhác mà ta hiếm khi được tấy ở các 2d engine
4.1.6 mmog ( massive multiplayer online game )
Hầu hết các mmog engine hiện nay đều tương thích và được tích hợp với một fps engine Nhờ vậy ngoài các yếu tố liên quan đến mạng thì loại engine này có các chức năng đáp ứng được các ứng
Trang 21dụng thực tại ảo và các yếu tố nghệ thuật được đảm bảo và đây là một yếu tố quan trọng để các người chơi hứng thú ngồi hàng giờ để chơi các game mạng.
Một số game được xây dựng trên mmog engine có thể kể đến như: ultima online ever ouest asheron’s call và anarchy online.
4.1.7 Một số game engine hiện nay
Ngày nay trên thế giới có rất nhiều game engine Mỗi game engine được tạo ra với những mục đích, đặc tính và độ phứctạp khác nhau và do đó sẽ rất khó khăn cho người dùng trong việc chọn
ra một game engine cho chính mình sử dụng Hầu hết các game engine ngày nay cung cấp tốt các tính năng cơ bản của một game engine và tuỳ thuộc vào nhu cầu cũng như khả năng mà chúng ta chọn ta một game engine phù hợp cho ứng dụng của mình Một số game engine tiêu biểu có thể kể đến như: unreal-$10000, quake2-
$10000, quake3-$250000, torque-$100, 3d game studio-$80,….
Ta có thể có một sự so sánh sơ bộ giữa các game engine về các chức năng mà chúng cung cấp cùng với giá tiền để có chúng qua bảng tóm tắt sau:
Game
Engine
Dark Basi c
Quak e 1
Unreal Halflif
e
Genesi s
Nebul a
Quake 2
Trang 22$10.00 0
Game
Engine
Game studio
Quak e 3
Lich_
tech 2
Vulpin e
Torqu e
Crysta
l space
Power render
Trang 23$100 $500 $5.500 Bảng 1.1 so sánh một số game engine
Trang 24CHƯƠNG 3 VERTEX SHADER VÀ PIXEL SHADER 3.1 tổng quát
Chưa có khi nào mà phần cứng dành cho đồ hoạ 3D phát triển như hiện nay Phần cứng hiện nay phát triển dựa theo tiêu chí nhanh hơn, mạnh hơn, đẹp hơn Dưới sự trợ giúp của các card đồ hoạ 3D tiên tiến, danh giới giữa ảo và thực ngày càng trở lên vô cùng mong manh Với sự ra đời của công nghệ Vertex Shader và Pixel Shader trên phần cứng, công nghiệp làm Game đã có bước tiến nhẩy vọt chưa từng có, cho ra đời hàng loạt Game có chất lượng đồ hoạ y như thật Vậy đâu là điều làm lên thế mạnh của công nghệ này, làm cách nào mà ta có thể ứng dụng đựơc nó, câu hỏi đó sẽ được giải đáp trong chương này Không đi sâu vào các khía cạnh khác, nội dung của chương này chủ yếu đề cập tới khía cạnh kỹ thuật và lý thuyết của công nghệ này
Vì công nghệ Vertex Shader và Pixel Shader không phải là công nghệ độc lập với môi trường do có sự phụ thuộc vào 3D API được sử dụng nên trong toàn bộ báo cáo này mọi vấn đề liên quan đến Shader đều được đề cập trên môi trường 3D API direct3d của Microsoft( phiên bản 9.0c)
3.2 Qui trình xử lý đồ hoạ (Graphic Pipeline)
Công nghệ Shaders gồm 2 thành phần cơ bản là: Vertex Shader ( còn được gọi là Vertex Program) và Pixel Shader (Hay Fragment Program) là công nghệ được tích hợp sẵn trên phần cứng cho phép người lập trình 3D hoàn toàn làm chủ quy trình xử lý dữ liệu và hình ảnh trên phần cứng
( Graphic Pipeline) Trong Direct3D, Vertex Shader và Pixel Shader được gọi chung là Programmable Pipeline để có thể phân biệt với Fixed function Pipeline Cần phải nói thêm Fixed function Pipeline là quy trình xử lý dữ liệu và hình ảnh 3D được cung cấp sẵn của Direct3D, quy trình này theo một thuật toán dựng hình cố định đối với mọi loại dữ liệu 3D đầu vào Hình vẽ sau đây minh hoạ cho quá trình xử lý đồ hoạ ( Graphic Pipeline) của
Direct3D
Trang 25Sơ đồ trên gói gọn toàn bộ quy trình xử lý 3D trên phần cứng của phần cứng direct3d, toàn bộ quy trình này được chia làm nhiều tầng xử lý hoàn toàn riêng biệt Như chúng ta thấy trên sơ đồ toàn bộ quy trình xử lý 3D bao gồm:
Xử lý dữ liệu đỉnh ( Vertex processing) Biến đổi Vertex từ không gian vật thể ( Model space ) sang không gian chiếu ( Projection space)
Xử lý đối tượng cơ sở ( Primitive Processing ) Chuyển đổi dữ liệu vertex trong không gian chiếu thành các dữ liệu cơ sở
Quá trình xử lý điểm ảnh ( Pixel Processing) Chuyển đổi dữ liệu cơ
sở thành các điểm ảnh trên màn hình ( Rendered Pixels)
Trước khi đi xa hơn ta cần nắm bắt 1 số khái niệm hay thuật ngữ chuyên môn dùng trong phần này:
Fixed Function Pipeline Quy trình xử lý đồ hoạ cố định được đưa ra bởi Direct3D Qui trình này sử dụng nhiều thuật toán 3D xử lý cố định trên các dữ liệu vào ( các thuật toán này là không thể thay đổi)
Programmanle Pipeline Qui trình xử lý đồ hoạ có sử dụng Vertex Shader
Graphi Pipeline Qui trình xử lý đồ hoạ 3D nói chung ( bao gồm luôn
cả Fixed Function Pipeline và Programmable Pipeline)
Vertex Dữ liệu đỉnh 3D Dữ liệu trong 1 đỉnh gồm nhiều thành phần như toạ độ vị trí (position), pháp tuyến (normal), toạ độ texrure (texture coordinate), màu diffuse (diffuse color ), màu phnr chiếu (specular color)…
Pixel Điểm ảnh trên màn hình
Primitive Đối tượng đồ hoạ cơ sở như tam giác, đường thảng, hình tròn, hình vuông…
HLSL – High Level Shader Langguage Ngôn ngữ Shaders cấp cao
do Microsoft phát triển tích hợp trong phiên bản Dỉect3D 9.0
3.3 Vertex Shader
Vertex Shader là chương trình có vai trò xử lý dữ liệu vertex khi được thi hành Vertex Shader trên Dỉect3D chủ yếu viết bằng hợp nhữ và HLSL (được phát triển kể từ phiên bản Direct3D 9.0 ) Vertex Shader là công nghệ phát triển theo các thế hệ phần cứng do đó nó có rất nhiều phiên bản khác nhau, các phiên bản cao hơn không thể chạy trên các thế hệ phần cứng cữ nhưng ngược lại thì được Các phiên bản Vertex Shader hiện nay gồm có vs_1_1, vs_2_0, vs_2_x, vs_3_0
Vertex Shader và Fixed Function sẽ loại trừ lẫn nhau trong khi thi hành, do đó ta phải nắm đwocj quy trình xử lý vertex của Fixed Function trước khi có thể tự viết cho mình một Vertex Shader như ý muốn
Trang 263.3.1.Xử lý Vertex bằng Fixed Function Pipeline
Trước khi tìm hiểu về Vertex Shader ta hãy xem qua qui trình xử lý Vertex mà Direct3D cung cấp sẵn thông qua Fixed Function Pipeline
Dữ liệu đầu vào của quy trình là sữ liệu đỉnh 3D (Vertex) trong không gian vật thể (model space ), trong không gian này mọi vertex đều có toạ độ tính từ gốc toạ độ của vật thể
Biến đổi thế giới (World transform) Biến đổi vertex từ không gian vật thể (model space ) sang không gian thế giới (world space), các vertex sẽ có toạ độ tương đối với nhau trong không gian thế giới
Vertex blending Biến đổi toạ độ của 1 vertex trên nhiều ma trận biến đổi thế giới khác nhau Mức độ tham gia của mỗi ma trận được xác định thông qua giá trị trọng lượng (weight) ứng với mỗi ma trận
Biến đổi quan sát ( View transform) Biến đổi vertex từ không gian thế giới vào không gian quan sát Vị trí của camera nằm ở gốc toạ độ của không gian quan sát, sau biến đổi này vertex sẽ có toạ độ là toạ độ tương đối đối với camera
Tính giá trị sương mù trên từng vertex (Vertex fog) Tính toán giá trị màu sắc của vertex khi áp dụng hiệu ứng sương mù
Chiếu sáng ( lighting and material) Tính toán ánh sáng trên từng vertex dụa trên mức độ phản xạ ánh sáng của vertex
Biến đổi chiếu ( Prọection transform) Biến đổi vertex từ không gian quan sát sang không gian chiếu Đây là công đoạn cuối cùng của quy trình biến đổi
Dữ liệu đầu ra của quy trình này sẽ là đầu vào quy trình xử lý đối tượng cơ sở (Primitive processing)
Trang 27Toàn bộ quy trình xử lý vertex trên của Fixed Function có thể được thay thế bằng chương trình Vertex Shader, khi đố Direct3Dhoàn toàn chuyển giao quyền xử lý Vertex cho Vertex Shader Vertex Shader sau khi kết thúc sẽ trat quyền điều khiển cùng với dữ liệu xử lý được lại cho Fixed Function Pipeline để xử lý tiếp.
3.3.2.Máy ảo Vertex Shader
Để biết được cách thiết kế 1 Vertex Shader trước tiên ta cần phải nắm được mô hình máy ảo Vertex Shader (Vertex Shader Virtual Machine ) Máy
ảo Vertex Shader là mô hình mang tính chất lý thuyết giúp ta dễ tiếp cận và hình dung cách thức mà Vertex Shader hoạt động Giống như 1 loại máy móc công nghiệp Vertex Shader nhận dữ liệu đầu vào (input), sau đố tiến hành xử lý dữ liệu đó bằng 1 số tác vụ, cuối sùng là xuất ra các thành phẩm
là các dữ liệu đầu ra (output) Sau đây là sơ đồlý thuyết:
Trong sơ đồ trên dữ liệu vertex được truyền từ trái sang phải Các thanh ghi (registers) là nơi chứa và quản lý các dữ liệu đầu vào và đầu ra của shader Các tác vụ được thi hành trong Shader được cấu tạo từ 1 tập các vi lệnh hợp ngữ (assembly- language instructions), các vi lệnh này đwocj thi hành ngay trên đơn vị số học và luận lý (Arithmetic Logic Unit, ALU) nằm trên GPU (Graphic Processor Unit) của cảd 3D Dữ liệu đầu vào của Vertex Shader đựoc truyền vào thông qua thanh ghi đầu vào (input registers) Vertex Shader sau khi thi hành sẽ xuất các giá trị đầu ra thông qua các thanh ghi đầu
ra ( output registers) Dữ liệu đầu vào của Shader là thông tin của 1 vertex được lấy từ trong vertex buffer ( do chương trình cung cấp), các dữ liệu này
Trang 28có thêt bao gồm toạ độ, pháp tuyến, toạ độ texture, màu diffuse… dữ liệu đầu ra của vertex Shader được trả thẳng lại cho qui trình xử lý (Graphic Pipeline) để chuyển qua công đoạn xử lý đối tượng cơ sở (primitive
processing)
Các thanh ghi được sử dụng trong Shader đều là các thanh ghi 4 chiều ( có thể lưu được 4 số thực trong 1 thanh ghi) Có 4 kiểu thanh ghi, mỗi kiểu
có cách sử dụng rất khác nhau
Thanh ghi dữ liệu vào (input registers) chứa dữ liệu đầu vào
Thanh ghi hàng (constant registers ) chưa các hằng số dùng trong ALU
Thanh ghi tạm (temporary registers) chứa các dữ liệu tạm thời
Thanh ghi dữ liệu ra (output registers) chứa kết quả tính toán của Vertex Shader
Với các thanh ghi đóng vai trò lưu trữ, ALU đống vai trò thi hành các lệnh, phần quan trọng nhất của Shader chính là các vi lệnh (instrutions) Vi lệnh trong Vertex Shgader chủ yếu là các vi lệnh toán học thực hiện 1 tác vụ
cụ thể như tính tích vô hưóng (dot product), tích hữu hướng (cross product), nhân ma trận, tìm minmax…
Danh sách các loại thanh ghi cũng như các vi lệnh có thể thanh khảo trong Direct3D SDK
3.3.3.Cấu trúc của một chương trình Vertex Sgader
bằng hợp ngữ
Vertex Shader nguyên thuỷe đựoc xây dựng bằng hợp ngữ Các ngôn ngữ cấp cao hơn dành cho Vertex Shader chỉ xuất hiện sau này như HLSL ( chỉ có trong Direct3D 9.0 trở lên) hay GLSL (được phát triển trong phiên bản opengl 2.0) Phần này sễ đề cập tới cấu trúc 1 chương trình Vertex
Shader viết bằng hợp ngữ, các ngôn ngư cấp cao sẽ được trình bày ở cuối chương này
Một chương trình Vertex Shader viết bằng hợp ngữ căn bản đựợc chia thành các phần sau đây:
Trang 29Chỉ thị phiên bản ( Version Instruction) Là thành phần đầu tiên trong chương trình, nó cho biết phiên bản Vertex shader được biên dịch thành Trong ví dụ trên chương trình sẽ chạy được trên phần cứng hỗ trợ vs_1_1 trở lên.
Ghi chú ( Comments) Được dùng để ghi các ghi chú trong chương trình như ý nghĩa của dữ liệu chứa trong thanh ghi… ghi chú được bắt đầu bằng (//) hay (;) cho ghi chú 1 dòng và ( /* ….*/) cho ghi chú nhiều dòng
Các hằng thanh ghi (constants) Các hằng được định nghĩa sau từ khoá def Các hằng thanh ghi có thể chứa tới 4 giá trị cho mỗi thanh ghi Như ở ví
dụ trên thanh ghi c8được gán giả là ( 0,1,2,3) Các hằng thanh ghi còn có thể đựơc gán giá trị bên trong chương trình chính thông qua phương thức
idirect3ddevice9::setvertexshaderconsstantx
Định nghĩa dữ liệu trong thanh ghi đầu vào ( input Register
Declarations) Các thanh ghi dữliệu vào như v0,v1… cần phải được định nghĩa dữ liệu trước khi sử dụng Việc định nghĩa này sẽ giúp Direct3D ánh
xạ được các dữ liệu thành phần trong Vertex trên bộ nhớ vào đúng các thanh ghi tương ứng Trong ví dụ trên, thanh ghi v0 sẽ chứa toạ độ vị trí, và v1 sẽ chứa toạ độ texture của vertex
Các vi lệnh (Instructions) Phần cuối cùng của 1 chương trình Vertex Shader là các vi lệnh hợp ngữ Mọi chương trình Vertex Shader đều phải xuất giá trị ra ít nhất là vào thanh ghi vị trí opos Trong cí dụ trên chương
Trang 30trình xuất vào 2 thanh ghi là thanh ghi vị trí opos và thanh ghi toạ độ Texture ot0.
3.4 Pixel Shader
Pixel Shader là chương trình tính toán và xử lý màu trên 1 hay nhiều điểm ảnh Pixel Shader sẽ được thực thi 1 lần cho mỗi điểm ảnh được dựng lên màn hình từ dữ liệu vertex vì thế pixel Shader khi chạy sẽ tốn nhiều thời gian hơn Vertex Shader ( chỉ xử lý 1 lần cho mỗi vertex) Pixel Shader có thể được viết bằng hợp ngữ hay HLSL Các phiên bản hiện nay của Pixel Shader gồm có ps_1_1,ps_1_2,ps_1_3 Ps_1_4, ps_2_0,ps_2_x và cuối cùng là ps_3_0
Cũng giống như Vertex Shader, Poxel Shader khi thi hành sẽ loại trừ với Fixed Function, do đố tìm hiều qui trình xử lý pixel của Fixed Function
là điều cần thiết
3.4.1.Xử lý điểm ảnh bằng Fixed Function Pipeline
Sau khi dữ liệu vertex được xử lý ( thành toạ dộ trong không gian chiếu) sẽ được chuyển qua để xử lý đối tượng cơ sở (Primitive Processin)
Clipping Loại bỏ các đối tượng hình học không nhìn thấy được trong khối quan sát ( viewing frustum) đêt tăng hiệu suất dựng hình
Chuẩn hoá hệ toạ độ thuần nhất (Hômgênous Divide) Chia các thành phần của dữ liệu cho phần từ cuối
Ánh xạ Viewport (Viewport Scaling) Ánh xạ dữ liệu vào toạ độ trong Viewport
Xử lý tam giác ( Triangle Setup) Chuẩn bị cho việc nội suy tam giác
và biến đổi các thuộc tính vertex thành thuộc tính điểm ảnh
Trang 31Sau khi quy trình xử lý đối tượng cơ sở hoàn tất, dữ liệu vertex đã được nội suy thành dữ liệu điểm ảnh sẵn sàng được chuyển sang qui trình xử
lý điểm ảnh (điểm ảnh lúc này chưa phải là giá trị màu mà chỉ mang các thuộc tính do tính toán được từ việc nội suy tamgiác mà thôi) Điểm ảnh sau
đó sẽ tính toán kết hợp các thuộc tính màu sắc và lấy mẫu texture tạo thành điểm màu cuối cùng Qui trình xử lý điểm ảnh bao gồm 2 công đoạn chính
Giai đoạn 1 biến đổi dữ liệ nội suy trong vertex (bao gồm màu diffuse, màu specular và toạ độ texture) thành các thuộc tính màu của điểm ảnh Gồm có các bước sau đây:
- Lấy mẫu texture ( sample texture) Lấy mẫu 1 hay nhiều texture
- hoà màu (Blend colors) Kết hợp các màu trong thuộc tính của điểm ảnh chủ yếu là màu cơ bản (diffuse), màu phản chiếu (specular) với cấcmù lấy mẫu từ texture
Giai đoạn 2 sẽ chuyển điểm màu ở cuối giai đoạn 1 thành điểm màu cuối cùng được dựng lên trên màn hình Quá trình này bao gồm các công đoạn sau đây:
So sánh alpha ( Alpha test) Tiến hành so sánh giá trị alpha để xem màu sắc của điểm ảnh có tham gia vào giá trịmàu cuối cùng hay không
So sánh cập nhật vùng đệm độ sâu ( Depth test) Cập nhật vùng đệm
độ sâu (Depth buffer) bằng độ sâucủa điểm ảnh nếu điểm ảnh được vẽ
So sánh stencil (Stencil test ) Tiến hành kiểm tra stencil nếu điểm ảnh đợi vẽ
Tính toán sương mù (Per-pixel fog) Kết hợp giá trị sương mù với màu của điểm ảnh
Hoà màu dựa trên độ alpha (Alpha blend) Tiến hành kết hợp màu của điểm ảnh đang vẽ với màu của điểm ảnh tường ứng trên màn hình
Dither Thực hiện chuẩn hoá màu
Trang 32Hiệu chỉnh Gamma Thực hiện hiệu chỉnh gamma trên điểm ảnh cuối cùng.
Trong qui trình xử lý điểm ảnh ở trên, chỉ có giai đoạn 1 là có thể thay thế xử lý bằng Piexel Shader Pixel Shader sau khi kết thúc sẽ trả giá trị màu tính được cho Fixed Function Pipeline Ta hãy xem qua chi tiế xử lý trong giai đoạn 1 của Fixed Function Pipeline Mô hình lý thuyết của Fixed
Function Pipeline như sau:\
Dữ liệu texture (Texture Data) Là dữ liệu của texture lấy từ tập tin hay khung hình (Render Target)
Sampler Dùng để lấy mẫu texture Có nghĩa là dùng toạ độ texture để tìm giá trị màu tương ứng tại toạ độ đó Các nộ lọc texture ( texture filtering)
có thể làm ảnh hưởng đến chất lượng mẫu nhận được (trừ chế độ lọc theo điểm (point filtering)) Fĩed Function Pipeline có tất cả 8 samplers
Cơ chế kết hợp đa texture (Multitexture Blender) bao gồm 8 tầng kết hợp ( Blending Stage) Các tầng kết hợp được sắp chồng lên nhau sao cho đầu ra của đầu ra của tâng 0 trở thành đầu vào cho tần 1, đầu ra của tầng 1 trở thành đầu vào cho tầng 2 và cứ thế Mỗi tầng như vậy gọi là tâng texture ( texture stage)
Cả giai đoạn 1 này ta có thể sử dụng Pixel Shader để xử lý thay cho fixed Function Mô hình lý thuyết của Pixel Shader thay thế tương ứng với Fixed Function như sau
Trang 33Theo mô hình trên Pixel Shader cũng dùng các samplers để lấy mẫu texture, nhưng giờ đây cơ chế kết hợp đa texture ( Multitexture Blender) đã được thực hiện ngay trong bản thân của Pixel Shader, bằng cách này các tác
vụ kết hợp (blending) hoàn toàn có thể được lập trình lại Một khi đã sử dụng Pixel Shader, ta không còn phải hiệu chỉnh các trạng thái của các tần texture (Texture Stage States) để điều khiển cơ chế kết hợp đa texture nữa vì mọi thứ đã được làm trong Pixel Shader
Đây chính là sức mạnh của Pixel Shader: người lập trình không còn phải tốn nhiều công sức để thiết lập các trạng thái cho các tầng texture
(texture Stage Staes) để điều khiển cơ chế kết hợp đa texture nữa vì mọi thứ
đẫ được làm trong Pixel Shader
Đây chính là sức manh ủa Pixel Shader: người lập trình không còn phải tốn nhiều công sức để thiết lập các trạng thái cho các tầng texture nữa,
họ giờ đây hoàn toàn có thể tự lập trình ra các thuật toán mới để sử dụng, thậm chí hoàn tôánc thể trung chuyển các luồn dữ liệu từ vertex shader vào pixel shader ( nếu dùng kết hợp cả 2 shader) Tuy nhiên vẫn còn những hạn chế do người lập trình vẫn chưa can thiệp được vào giai đoạ 2 của qui trình
xử lý pixel, giai đoạn này vẫn còn bị sự kiểm soát của Fixed Function
Pipeline Phần sau ta sễ xem qua kiến trúc của máy ảo Pixel Shader
3.4.2.Máy ảo Pixel Shader
Trang 34Pixel Shader dung các toán tử toán học để xử lý dữ liệu bên trong từng điểm ảnh để tính ra giá trị màu sắc cuối cùng của điểm ảnh.
Dữ liệu trong mô hình được di chuyển từ trái sang phải Pixel Shader
sử dụng các thanh ghi ( rgisters) để lưu trữ, quản lý các dữ liệu đầu cào (input), đầu ra ( output), đồng thời thao tác trên chúng nhờ vào các vi lệnh được thực thi bởi đơn vị số học và luận lý (ALU) Pixel Shader khi thi hành
sẽ biến đổi các thuộc tính bên trong của điểm ảnh ( bao gồm vị trí, pháp tuyến, toạ độ texture, màu diffúe…) thành giá trị màu sắc của điểm đó Các thanh ghi dữ liệu vào của Pixel Shader sẽ nhận dữ liệu vào là các giá trị nội suy của vertex Chức năng của các texture sampler là dung toạ độ texture từ các thanh ghi đầu vào để lấy mẫu texture và trả về giá trị màu lấy được
Tương tự như Vertex Shader, Pixel Shader sẽ ghi các giá trị kết quả vào các thanh ghi đầu ra ( thường là giá trị màu sắc của điểm ảnh) Thanh ghi đầu ra sau khi nhận dữ liệu sẽ trả dữ liệu về cho Graphic Pipeline để xử
lý tiếp giai đoạn 2
Sau đây là danh sách các loại thanh ghi được dung trong pixel Shader
và chức năng của chúng
Trang 35Thanh ghi dữ liệu vào ( input registers) chứa dữ liệu đầu vào ( nhận được từ quá trình xử lý đối tượng cơ sở ( Primitive processing)).
Thanh ghi hằng (constant registers) chứa các hằng số dùng trong ALU
Thanh ghi tạm ( temporary registers) chứa các dữ liệu tạm thời
Thanh ghi dữ liệu ra (output registers ) chứa kết quả tính toán của Pixel shader
Thanh ghi dữ liệu ra ( output registers) chứa kết quả tính toán của Pixel Shader
Thanh ghi điều khiển ( Flow control registers) diều khiển thứ tự các vi lệnh được thực thi
Texture sampler dung toạ độ texture để lấy mẫu texture sau đó trả về lại cho Shader
Các vi lệnh trong Pixel Shader chính là thành phần chính của Pixel Shader Các vi lệnh đảm nhận việc thực thi một số tác vụ toán học trên dữ liệu ví dụ như tính tích vô hướng ( dot product), nhân ma trận, tính vector đơn vị… danh sách các loại thanh ghi cũng như các vi lệnh có thể tham khảo trong Direct3D SDK
3.4.3 Cấu trúc của một chương trình Pixel Shader bằng
Trang 36Ghi chú ( Comments) Được dùng để ghi các ghi chú trong chương trình như ý nghĩa của dữ liệu chứa trong thanh ghi… ghi chú được bắt đầu bằng (//) hay (;) cho ghi chú 1 dòng và ( /* ….*/) cho ghi chú nhiều dòng.
Các hằng thanh ghi (constants) Các hằng được định nghĩa sau từ khoá def Các hằng thanh ghi có thể chứa tới 4 giá trị cho mỗi thanh ghi Như ở ví
dụ trên thanh ghi c8được gán giả là ( 0,1,2,3) Các hằng thanh ghi còn có thể đựơc gán giá trị bên trong chương trình chính thông qua phương thức
idirect3ddevice9::setvertexshaderconsstantx
Định nghĩa dữ liệu trong thanh ghi đầu vào ( input Register
Declarations) Các thanh ghi dữliệu vào như v0,v1… cần phải được định nghĩa dữ liệu trước khi sử dụng Việc định nghĩa này sẽ giúp Direct3D ánh
xạ được các dữ liệu thành phần trong Vertex trên bộ nhớ vào đúng các thanh ghi tương ứng Trong ví dụ trên, thanh ghi v0 sẽ chứa toạ độ vị trí, và v1 sẽ chứa toạ độ texture của vertex
Các vi lệnh (Instructions) Phần cuối cùng của 1 chương trình Vertex Shader là các vi lệnh hợp ngữ Mọi chương trình Vertex Shader đều phải xuất giá trị ra ít nhất là vào thanh ghi vị trí opos Trong cí dụ trên chương trình xuất vào 2 thanh ghi là thanh ghi vị trí opos và thanh ghi toạ độ Texture ot0
3.5 Pixel Shader
Pixel Shader là chương trình tính toán và xử lý màu trên 1 hay nhiều điểm ảnh Pixel Shader sẽ được thực thi 1 lần cho mỗi điểm ảnh được dựng lên màn hình từ dữ liệu vertex vì thế pixel Shader khi chạy sẽ tốn nhiều thời gian hơn Vertex Shader ( chỉ xử lý 1 lần cho mỗi vertex) Pixel Shader có thể được viết bằng hợp ngữ hay HLSL Các phiên bản hiện nay của Pixel Shader gồm có ps_1_1,ps_1_2,ps_1_3 Ps_1_4, ps_2_0,ps_2_x và cuối cùng là ps_3_0
Cũng giống như Vertex Shader, Poxel Shader khi thi hành sẽ loại trừ với Fixed Function, do đố tìm hiều qui trình xử lý pixel của Fixed Function
là điều cần thiết
3.5.1 Xử lý điểm ảnh bằng Fixed Function Pipeline
Trang 37Sau khi dữ liệu vertex được xử lý ( thành toạ dộ trong không gian chiếu) sẽ được chuyển qua để xử lý đối tượng cơ sở (Primitive Processin).
Clipping Loại bỏ các đối tượng hình học không nhìn thấy được trong khối quan sát ( viewing frustum) đêt tăng hiệu suất dựng hình
Chuẩn hoá hệ toạ độ thuần nhất (Hômgênous Divide) Chia các thành phần của dữ liệu cho phần từ cuối
Ánh xạ Viewport (Viewport Scaling) Ánh xạ dữ liệu vào toạ độ trong Viewport
Xử lý tam giác ( Triangle Setup) Chuẩn bị cho việc nội suy tam giác
và biến đổi các thuộc tính vertex thành thuộc tính điểm ảnh
Sau khi quy trình xử lý đối tượng cơ sở hoàn tất, dữ liệu vertex đã được nội suy thành dữ liệu điểm ảnh sẵn sàng được chuyển sang qui trình xử
lý điểm ảnh (điểm ảnh lúc này chưa phải là giá trị màu mà chỉ mang các thuộc tính do tính toán được từ việc nội suy tamgiác mà thôi) Điểm ảnh sau
đó sẽ tính toán kết hợp các thuộc tính màu sắc và lấy mẫu texture tạo thành điểm màu cuối cùng Qui trình xử lý điểm ảnh bao gồm 2 công đoạn chính
Trang 38Giai đoạn 1 biến đổi dữ liệu nội suy trong vertex (bao gồm màu
diffuse, màu specular và toạ độ texture) thành các thuộc tính màu của điểm ảnh Gồm có các bước sau đây:
- Lấy mẫu texture ( sample texture) Lấy mẫu 1 hay nhiều texture
- hoà màu (Blend colors) Kết hợp các màu trong thuộc tính của điểm ảnh chủ yếu là màu cơ bản (diffuse), màu phản chiếu (specular) với cấcmù lấy mẫu từ texture
Giai đoạn 2 sẽ chuyển điểm màu ở cuối giai đoạn 1 thành điểm màu cuối cùng được dựng lên trên màn hình Quá trình này bao gồm các công đoạn sau đây:
So sánh alpha ( Alpha test) Tiến hành so sánh giá trị alpha để xem màu sắc của điểm ảnh có tham gia vào giá trịmàu cuối cùng hay không
So sánh cập nhật vùng đệm độ sâu ( Depth test) Cập nhật vùng đệm
độ sâu (Depth buffer) bằng độ sâucủa điểm ảnh nếu điểm ảnh được vẽ
So sánh stencil (Stencil test ) Tiến hành kiểm tra stencil nếu điểm ảnh đợi vẽ
Tính toán sương mù (Per-pixel fog) Kết hợp giá trị sương mù với màu của điểm ảnh
Hoà màu dựa trên độ alpha (Alpha blend) Tiến hành kết hợp màu của điểm ảnh đang vẽ với màu của điểm ảnh tường ứng trên màn hình
Dither Thực hiện chuẩn hoá màu
Hiệu chỉnh Gamma Thực hiện hiệu chỉnh gamma trên điểm ảnh cuối cùng
Trong qui trình xử lý điểm ảnh ở trên, chỉ có giai đoạn 1 là có thể thay thế xử lý bằng Piexel Shader Pixel Shader sau khi kết thúc sẽ trả giá trị màu tính được cho Fixed Function Pipeline Ta hãy xem qua chi tiế xử lý trong giai đoạn 1 của Fixed Function Pipeline Mô hình lý thuyết của Fixed
Function Pipeline như sau:\
Trang 39Dữ liệu texture (Texture Data) Là dữ liệu của texture lấy từ tập tin hay khung hình (Render Target).
Sampler Dùng để lấy mẫu texture Có nghĩa là dùng toạ độ texture để tìm giá trị màu tương ứng tại toạ độ đó Các nộ lọc texture ( texture filtering)
có thể làm ảnh hưởng đến chất lượng mẫu nhận được (trừ chế độ lọc theo điểm (point filtering)) Fĩed Function Pipeline có tất cả 8 samplers
Cơ chế kết hợp đa texture (Multitexture Blender) bao gồm 8 tầng kết hợp ( Blending Stage) Các tầng kết hợp được sắp chồng lên nhau sao cho đầu ra của đầu ra của tâng 0 trở thành đầu vào cho tần 1, đầu ra của tầng 1 trở thành đầu vào cho tầng 2 và cứ thế Mỗi tầng như vậy gọi là tâng texture ( texture stage)
Cả giai đoạn 1 này ta có thể sử dụng Pixel Shader để xử lý thay cho fixed Function Mô hình lý thuyết của Pixel Shader thay thế tương ứng với Fixed Function như sau
Trang 40Theo mô hình trên Pixel Shader cũng dùng các samplers để lấy mẫu texture, nhưng giờ đây cơ chế kết hợp đa texture ( Multitexture Blender) đã được thực hiện ngay trong bản thân của Pixel Shader, bằng cách này các tác
vụ kết hợp (blending) hoàn toàn có thể được lập trình lại Một khi đã sử dụng Pixel Shader, ta không còn phải hiệu chỉnh các trạng thái của các tần texture (Texture Stage States) để điều khiển cơ chế kết hợp đa texture nữa vì mọi thứ đã được làm trong Pixel Shader
Đây chính là sức mạnh của Pixel Shader: người lập trình không còn phải tốn nhiều công sức để thiết lập các trạng thái cho các tầng texture
(texture Stage Staes) để điều khiển cơ chế kết hợp đa texture nữa vì mọi thứ
đẫ được làm trong Pixel Shader
Đây chính là sức manh ủa Pixel Shader: người lập trình không còn phải tốn nhiều công sức để thiết lập các trạng thái cho các tầng texture nữa,
họ giờ đây hoàn toàn có thể tự lập trình ra các thuật toán mới để sử dụng, thậm chí hoàn tôánc thể trung chuyển các luồn dữ liệu từ vertex shader vào pixel shader ( nếu dùng kết hợp cả 2 shader) Tuy nhiên vẫn còn những hạn chế do người lập trình vẫn chưa can thiệp được vào giai đoạ 2 của qui trình
xử lý pixel, giai đoạn này vẫn còn bị sự kiểm soát của Fixed Function
Pipeline Phần sau ta sễ xem qua kiến trúc của máy ảo Pixel Shader
3.5.2 Máy ảo Pixel Shader