PDA

View Full Version : [TIP] OpenGL vs. Direct3D



Mach2
16-05-2003, 00:54
Introduction
Khi lập trình game, ý tôi muốn nói là lập trình game nghiêm túc theo đúng nghĩa của nó, tức là không phải dùng phần mềm tạo game hay dùng một engine nào đó có sẵn, người lập trình chắc chắn phải "đụng đến" vấn đề lập trình đồ hoạ. Khi đó họ sẽ phải chọn lựa giữa 2 bộ thư viện API đồ họa phổ biến nhất hiện nay. Đó là OpenGL và Direct3D. Sử dụng thư viện nào, thư viện nào tốt hơn trong hai bộ thư viện này đã và đang luôn luôn là câu hỏi gây nên vô số tranh cãi. Thông thường các lập trình viên thường chia thành hai trường phái đối lập hẳn nhau. Một cho rằng DirectX là con đường duy nhất dẫn đến La Mã và còn lại thì ngã về OpenGL. Trong bài viết này, mục đích của tôi là phân tích một số mặt mạnh và yếu của hai bộ thư viện trên thông qua một số kinh nghiệm (ít) và thông tin thu thập được trong thời gian qua (của người khác-nhiều). Tôi cũng không có ý định đưa chi tiết cấu trúc cũng như hướng dẫn cách sử dụng chúng trong bài viết này. Tuy nhiên các bạn có thể tìm thấy vô số các bài viết, hướng dẫn và sách vở về chúng trên mạng nếu muốn. Links về Direct3D và OpenGL đã rất nhiều lần được CrazyBabe và tôi đưa lên diễn đàn này.
Chú thích thêm: Tôi là một thành viên của trường phái OpenGL. Tôi bắt đầu nghiên cứu OpenGL trong khoảng 2 năm nay và chỉ biết rất ít về Direct3D, do đó các kiến thức và hiểu biết của tôi về Direct3D chỉ có hạn và vì vậy các nhận xét về Direct3D phần lớn chỉ các thông tin thu thập từ sách vở. Vậy nếu bạn thấy rằng tôi hơi ngả về OpenGL thì cũng xin châm chước cho và đừng làm bài viết này thành ra một cuộc tranh cãi nhé. Cám ơn rất nhiều.

Direct3D
Trong một thời gian rất dài, Direct3D không được xem không thể là đối thủ của OpenGL trong mặt trận game. Tuy nhiên gần đây, sau hàng loạt cố gắng và cải tiến đáng kể của Microsoft, Direct3D đã từng bước giàng được một thị phần đáng kể trong thế giới phát triển game hiện nay, nhất là sau sự ra đời của DirectX7, “kẻ huỷ diệt” của OpenGL. Trái hẳn với các phiên bản Direct3D đầy bọ trước, đồ hoạ trong DirectX7 được tách thành 2 phần riêng biệt: DirectDraw và Direct3D, xử lý các hình ảnh 2D và 3D, theo thứ tự đó. Cùng với hàng loạt cải tiến mới và hiệu quả, DirectX từng bước trở thành một chuẩn mực và lựa chọn đầu tiên của các lập trình viên game trên nền Windows.
Direct3D được xây dựng trên nền kiến trúc COM. Chắc hẳn các bạn đã biết đến khái niệm này. Nói nôm na, cho dễ hiểu, Direct3D làm việc bằng các class, tức hướng đối tượng. Với một số lượng class “khấm khá”, Direct3D hỗ trợ hầu hết các công việc mà một lập trình viên cần, ngoài ra nó còn đặt ra và hỗ trợ các định dạng của riêng nó như mô hình mesh (.X) và texture (.dds). Điều này đặt biệt “hay ho”. Một điều đáng lưu ý nữa là Direct3D hỗ trợ chi tiết toàn bộ rendering pipeline của nó. Bạn có thể can thiệp ngay cả vào một số phần của rendering pipeline.
Phiên bản đang được sử dụng phổ biến hiện nay của dòng DirectX, DirectX8, đã bổ sung vào hai thành phần đang được xem là “mode” trong giới đồ hoạ 3D. Đó là Programmable Pixel và Vertex Shaders. Đương nhiên khó mà giải thích được hai khái niệm trên một cách ngắn gọn, tuy nhiên có thể nói ngắn gọn là với hai công cụ trên, bạn có thể sửa đổi một số phần trong rendering pipeline của Direct3D bằng một số mã lệnh gần giống assembly. Nghe thì có vẻ không ghê gớm gì, nhưng nếu bạn đã từng bị kẹt như tôi trong khi đang làm một số hiệu ứng trong OpenGL thì việc can thiệp được “một tí gì” vào rendering pipeline quả là một phép thần kỳ…. Tuy nhiên, cũng phải nói thêm rằng, không phải card đồ hoạ nào cũng support hai công cụ trên đâu. Ít nhất thì cũng phải card kha khá như ATI 8500, GF3, GF4Ti,… trở lên. Đáng buồn thay.
Direct3D trong phiên bản DX8 bổ sung hàng tá hỗ trợ trong việc tạo hiệu ứng, điều này đã qua mặt OpenGL, vốn được cập nhật khá chậm chạp. Phiên bản DX9 hiện nay hỗ trợ vô số hiệu ứng. Có thể nói, với Pixel Shaders và Vertex Shaders, tất cả những gì bạn cần hiện nay là một card đồ họa tốt. Thế thôi, sau đó thì… tha hồ tưởng tượng!!!
Microsoft là một đại gia. Điều đó thì ai cũng biết. Họ hẳn là có liên hệ chặt chẽ với các nhóm phát triển phần cứng (như nVidia hay ATI,… ), vì vậy về chuyện ứng dụng phần cứng tối ưu hay tận dụng sức mạnh của các card đồ hoạ mới nhất thì bạn khỏi phải lo. Phần mềm đi trước phần cứng (như trường hợp DX9 ra đời cả mấy tháng nay mà hiện nay vẫn chưa có game nào tận dụng hết sức mạnh của nó) là chuyện bình thường.
Tuy nhiên, Direct3D không phải là không có điểm yếu. Người ta thường nói, “lắm tài thì nhiều tật”. Điểm mạnh của Direct3D cũng là điểm yếu của nó.
Direct3D quá chi tiết, mà chi tiết quá thì thế nào cũng phức tạp. Điểm yếu đầu tiên của Direct3D là quá phức tạp. Bạn phải mất khoảng từ 200 dòng code để có thể bắt tay vào vẽ bằng Direct3D. Đối với các bạn mới bắt đầu học thì chuyện này cũng tương tự như chuyển từ Turbo C sang Visual C++… Tuy nhiên, điều đó cũng chẳng đáng gì so với việc bạn phải có một số kiến thức về đồ hoạ máy tính lý thuyết (lý thuyết nhá, ý tôi muốn nói là ma trận, vector, nội suy,… những thứ khô khan đối với dân tin) bởi Direct3D quá chi tiết, và bạn cần phải hiểu rõ ràng tất cả nhưng hàm và phương thức chi tiết này. Điều này dẫn đến code của bạn sẽ rất dễ bị bọ chui vào nếu không cẩn thận.
Direct3D do Microsoft phát triển. Và vì bạn đã biết Microsoft chẳng ưa gì Linux hay Unix, (Bill Gate thậm chí còn muốn chúng “chết” nhanh nữa là khác), vì vậy Direct3D chỉ chạy trên Windows, và chỉ Windows mà thôi. Đừng hòng chú chim cánh cụt mó tay cùi vào nhá. Bạn chọn Direct3D, thế thì phải chắc chắn là game bạn viết chỉ chạy trên Windows thôi nhá. Đừng mong gì recompile lại trên Linux hay Unix.
Direct3D hỗ trợ game tốt, điều này thì ngay cả dân trung thành hâm mộ OpenGL từ bao nhiêu năm qua dù si mê cuồng vọng OpenGL đến mấy thì cũng phải công nhận. Tuy nhiên, trong mặt trận khác như đồ hoạ kỹ thuật, CAD, hay ứng dụng đòi hỏi 3D thì Direct3D chưa hề có chỗ chen chân vào.
Một điểm nữa làm cho Direct3D thêm phần rắc rối cuộc đời là do sự cống hiến nhiệt tình của Microsoft. Cứ mỗi phiên bản DirectX khác nhau là bác Bill nhà ta xây dựng lại, cập nhật thêm tùm lum nào là đối tượng mới, nào là hàm mới. Chuyện này nói ra thì cũng tốt bởi vì cuối cùng là lập trình viên được lợi thôi, tuy nhiên làm như thế thì các chương trình viết dễ bị không tương thích lắm. Ví dụ như bạn viết game trên nền DirectX7, đến khi chạy trên nền DirectX9 sẽ bị không tương thích nếu như lỡ dại xài một số hàm mà DirectX9 không còn hỗ trợ (như ảnh stereo chẳng hạn), lúc đó thì khóc dở mếu dở. Microsoft đã thông báo là phiên bản tiếp theo DirectX X (!!!,đừng nhầm với *** nhá) ít nhất sẽ không ra mắt cho tới giữa năm sau do DirectX9 hiện đã quá đủ đối với phần cứng hiện nay. Hy vọng họ không “đẻ” ra thêm cái gì mới, DirectDraw, Direct3D và DirectSurface hiện nay đã đủ phức tạp quá rồi còn gì.
Tương lai của Direct3D vẫn còn nằm ở phía trước và chắc chắn rằng (hu hu!!!) nó sẽ trở thành một chuẩn mực của tất cả game chạy trên nền Windows. Nếu bạn chọn Direct3D, bạn đã mua được một chiếc vé bay vào tương lai của anh Bill rồi đấy.

OpenGL
OpenGL đã được ra đời và phát triển hơn 10 năm nay. Với một thời gian dài như vậy, rõ ràng nó đã chứng tỏ được sự ổn định và hấp dẫn của mình rồi, bởi không ai lại đi xài một bộ thư viện quá già nua như thế mà không có lý do chứ? OpenGL được phát triển bởi SGI từ 10 năm trước, với mục đích là tạo nên một bộ thư viện đồ hoạ ổn định lâu dài và hướng đến tương lai. Xin nói rõ là: tương lai của 10 năm trước, tức OpenGL nhắm vào các hệ thống đồ hoạ lớn và đắt tiền như các máy trạm SGI chuyên dùng vào đồ họa. Trong 10 năm đó, OpenGL phát triển rất chậm (cho đến hiện nay mới chỉ là version 1.4), trong khi tốc độ của các card đồ hoạ bình dân (là loại card mà chúng ta hiện đang sử dụng) đã vượt xa mức tưởng tượng của các nhà phát triển OpenGL 10 năm trước. Với một thực tế như thế, có thể nói thời hoàng kim của OpenGL đã đến và trôi qua từ lâu.
Thế nhưng, không phải vì thế mà nói OpenGL không đi kịp thời đại. OpenGL vẫn gắn bó mật thiết với sự phát triển của phần cứng thông qua ARB (Architecural Review Board). Đây là một hội đồng bao gồm các công ty và nhà phát triển phần cứng có liên quan đến đồ hoạ, có thể kể như 3D Lads, SGI, nVidia, ATI, Microsoft, id Software hay Intel nữa. Nhóm này chuyên đưa ra các chuẩn và mở rộng (extensions) của OpenGL để bộ thư viện này không bị lỗi thời với nhịp đua của thời đại. Có thể nói là các extensions là cầu nối để OpenGL có thể bắt kịp với hiện tại, là những bộ chip xử lý đồ hoạ mới được cập nhật với bao nhiêu chức năng cao cấp, điều mà những người phát triển OpenGL từ thuở sơ khai đã chưa hề tưởng tượng được.
OpenGL được phát triển từ lâu, vào thời mà OOP vẫn chưa được thịnh hành, do đó nó đơn thuần chỉ là một bộ thư viện API bao gồm các nhiều hàm đồ hoạ. OpenGL có khoảng 200 hàm đồ hoạ chuẩn, và khoảng chừng đó số lượng các hàm extensions. Con số này trông có vẻ nhiều, tuy nhiên không thấm vào đâu so với DirectX. Các hàm của OpenGL chỉ thuần tuý là hàm, tức là không dùng class, tuy nhiên bạn có thể tạo class của bạn trên cơ sở các hàm này để tạo nên ứng dụng OpenGL bằng OOP của mình. Sử dụng OpenGL như thế nào hoàn toàn tuỳ thuộc vào bạn.
Các hàm và khai báo của OpenGL đặc biệt thân thiện với người sử dụng. Các tên hàm như glColor3f hoàn toàn có thể nói rõ bản chất hoạt động của hàm. “gl” chỉ hàm của OpenGL, “Color” chỉ rõ đây là hàm khai báo màu sắc, “3” chỉ số thành phần màu sắc (R, G, B), trong khi “f” chỉ loại kiểu dữ liệu đưa vào là float. Việc sử dụng ít hàm và tên hàm thân thiện đã làm cho việc lập trình bằng OpenGL đơn giản, ngắn gọn và dễ debug hơn nhiều so với Direct3D.
OpenGL có nhiều điểm mạnh vượt trội. Điều đầu tiên có thể nói về OpenGL là tính tương tích của bộ thư viện này rất cao. Bạn có thể sử dụng OpenGL trong hầu hết các hệ khác nhau như Linux, Unix và dĩ nhiên cả Windows. Bất cứ trình dịch bằng ngôn ngữ lập trình nào cũng có thể dùng OpenGL bởi nó được cung cấp dưới dạng API trong các thư viện động dll, và điều quan trọng nhất là các thư viện động này đã được tích hợp sẵn vào Windows. Bạn không cần cài đặt OpenGL, chỉ cần include file header của OpenGL vào và voila, viết code thoải mái.
OpenGL với sự giúp đỡ của ARB đã bắt kịp với nhịp tiến của các card đồ hoạ mới nhất hiện nay. OpenGL support tất cả những gì Direct3D hỗ trợ, bao gồm cả Pixel Shaders và Vertex Shaders, tuy nhiên vẫn cũng chỉ các card như GF3, GF4Ti hay ATI 8500 mới có thể dùng được các chức năng này (buồn 5 phút cho những kẻ sử dụng GF4MX như tôi). Bởi vì ARB bao gồm nhiều công ty khác nhau, trong những ứng dụng khác nhau, nên OpenGL hỗ trợ đồ hoạ mạnh, không những trong game mà kể cả các ứng dụng như CAD, hay mô phỏng.
Tuy nhiên điểm mạnh chủ yếu của OpenGL là nó quá đơn giản. Đây là một điểm rất “hấp dẫn” đối với những lập trình viên “mì ăn liền”, muốn tìm kiếm một thư viện nhanh, hiệu quả và dễ học. Viết code bằng OpenGL thường làm cho chương trình đơn giản, sáng sủa và dễ debug bởi lý do này. Ngoài ra, OpenGL còn che dấu toàn bộ quá trình rendering pipeline phức tạp của nó, do đó bạn chẳng cần quan tâm đến cấu trúc hay chi tiết của nó như Direct3D. Khởi tạo OpenGL chỉ cần khoảng 20 dòng code, thay vì vài trăm như Direct3D. Vả lại một số thư viện cộng thêm như AUX hay GLUT còn làm việc này giùm bạn. Chỉ một hàm, thế là OpenGL khởi tạo xong!!!
Thế nhưng cũng như Direct3D, điểm yếu của OpenGL nằm ngay ở các điểm mạnh trên. Việc các hàm OpenGL không đi sâu vào chi tiết giúp ta đỡ phải quan tâm đến “mấy cái không đâu”, tuy nhiên nếu khi cần đến “mấy cái không đâu” này thì mới thực sự là ác mộng. Bạn không thể can thiệp vào rendering pipeline của OpenGL đơn giản bởi vì nó không cho phép. Điều này làm cho một số hiệu ứng trở nên khó xử lý với OpenGL, trong khi Direct3D cho phép thực hiện dễ dàng, ví dụ như customize blending.
OpenGL dùng cầu nối là các extensions, tuy nhiên do các thành viên của ARB có nguồn gốc từ nhiều công ty khác nhau, vì vậy họ thường không đưa ra được một chuẩn chung (“lắm thầy thì thối ma” thôi). nVidia, ATI cứ đưa ra chuẩn riêng của mình, cùng một hàm Pixel Shaders, nVidia đưa ra một hàm, ATI đưa ra một hàm, tên khác nhau, nhận biến khác nhau, và quan trọng là card hãng nào chỉ support extensions của hãng nấy. Vậy là nếu muốn sử dụng chức năng này, ta phải test xem card của máy user là card gì rồi chạy code tương ứng, thật là rắc rối cuộc đời. Chính vì lý do này mà chỉ một số đại gia game gạo cội mới dám xử dụng các chức năng chết người này. Điều này cũng làm cho việc sử dụng các extensions không được phổ biến lắm, ngoại trừ các nhà phát triển gạo cội như id Software hoặc các chương trình test card mà thôi.
Tuy tên hàm của OpenGL được đặt khá thân thiện, tuy nhiên điều này cũng gây ra ít nhiều phiền toái. Cùng một hàm khai báo màu cho vertex đang xài mà có đến glColor3f, glColor3ub, glColor3b, glColor3fv, glColor4f,… Tổng cộng có đến 32(!!!) hàm glColor… Thật đau khổ vì nếu bạn muốn sử dụng dữ liệu vào kiểu gì, bạn phải nhớ hàm tương ứng. Tuy nhiên điều này cũng có thể giải quyết được bằng cách overload các hàm cùng tên, việc mà hầu hết các ngôn ngữ OOP đều support. Một điều cần quan tâm nữa là các hàm của OpenGL tuy dễ sử dụng nhưng để hiểu rõ các đối số vào thì không dễ dàng tí nào, bạn cần phải hiểu chúng thật rõ mới có thể tạo được hiệu ứng như mong đợi. Chẳng hạn blending có khoảng 10 tham số phối hợp đôi. Nếu bạn không hiểu rõ cách làm việc của cơ chế blend và các tham số của OpenGL thì xác suất việc chọn đúng 1 trong 90 tổ hợp này để tạo thành hiệu ứng đúng có thể so sánh với xác suất bạn đánh trúng đề!!!
Tuy đã già, nhưng OpenGL vẫn chưa có vẻ sẽ chịu chết, ít nhất là trong vòng năm tới. 3D Lads và các thành viên ARB đang xúc tiến để cho ra đời OpenGL 2.0, một phiên bản mang một khuôn mặt hoàn toàn mới. Theo lời các nhà phát triển, phiên bản này sẽ cho phép người sử dụng can thiệp vào quá trình rendering pipeline dễ dàng bằng cách thay đổi hay tự viết code mới. Và quan trọng hơn, các extensions sẽ dùng một chuẩn chung thống nhất. Vậy nếu bạn chọn OpenGL, bạn hoàn toàn có thể tin tưởng vào nó thông qua quá khứ huy hoàng của nó và một tương lai phía trước.

Mach2
16-05-2003, 00:55
OpenGL vs. Direct3D
Như vậy bạn đã hiểu rõ phần nào về hai bộ thư viện đồ hoạ OpenGL và Direct3D. Nếu như tất cả những phân tích trên chưa làm cho bạn quyết định rằng mình sẽ chọn bộ thư viện nào thì hãy đọc phần này. Ta sẽ phân tích các câu hỏi đã được đặt ra (một số vẫn chưa có được câu trả lời thích đáng) của hai trường phái OpenGL và Direct3D như sau.

- Học OpenGL và học Direct3D, học cái nào dễ hơn?
OpenGL đơn giản hơn Direct3D nhiều, do đó cũng dễ học hơn nhiều. Tuy nhiên học sâu đến một lúc nào đó thì học OpenGL lại khó hơn Direct3D. Chọn cái nào là quyền của bạn, tuy nhiên một khi đã chọn rồi thì đừng thay đổi, đừng hỏi “What if I studied OGL/D3D?” Hãy trung thành với con đường bạn chọn. Đường nào cũng chông gai cả nhưng nếu kiên trì thì thế nào cũng có ngày nhận được hoa hồng.
- Bộ thư viện nào là có tương lai hơn cả? Direct3D và OpenGL sẽ còn sống được bao lâu nữa?
Khó có thể nói chắc được. Direct3D có lẽ đang ở thời hoàng kim của nó, tuy nhiên OpenGL vẫn chưa mất chỗ đứng của nó trong giới phát triển game hiện nay. Với tiềm năng và ứng dụng rộng rãi như hiện nay, OpenGL và Direct3D chỉ thực sự “chết” khi một bộ thư viện mới sử dụng công nghệ mới ra đời. Trong tương lai không xa, có lẽ với sự phát triển vũ bảo của công nghệ vi xử lý, sự ra đời của một thư viện realtime-raytracing không phải là một điều viễn tưởng. Sức mạnh các máy để bàn cao cấp hiện nay đã ngang bằng với sức mạnh của các siêu máy tính đồ hoạ 5 năm trước. Cách đây một năm, siêu máy tính dùng để render bộ phim “Final Fantasy: The Spirits Within” có thể render được hơn 30 cảnh có phân giải 1???x1??? (tôi ko nhớ rõ là bao nhiêu) bằng phương pháp radiosity. Liệu 4 năm sau, có thể nào các PC có thể làm được việc này hay không?
- OpenGL và Direct3D, thư viện nào xử lý nhanh hơn?
Tôi rất tiếc câu trả lời là “Tuỳ”. Hiện nay, tất cả những gì làm được bằng OpenGL đều có thể làm được bằng Direct3D. Sử dụng thư viện nào nhanh hơn? Điều đó phụ thuộc chủ yếu vào bạn, vào tôi, vào những người lập trình viên. Trình độ của bạn sẽ quyết định điều này, không phải thư viện mà bạn sử dụng.
- OpenGL và Direct3D, cái nào cho hình ảnh đẹp hơn?
Rất tiếc lại phải trả lời “Tuỳ”. Cách đây 1 năm, Direct3D7 vẫn không thể nào cho hình ảnh ngang bằng với OpenGL, tuy nhiên với Direct3D8, sự việc đã đổi khác. Các filter Mipmap và hiệu ứng trong Direct3D8 đã được cải tiến đáng kể, các kỹ thuật Pixel Shaders và Vertex Shaders thật sự đã làm lằn ranh về hình ảnh giữa Direct3D và OpenGL bị xoá nhoà. Vấn đề của đẹp hay xấu hiện giờ không phụ thuộc vào thư viện bạn sử dụng nữa, mà tuỳ thuộc vào kỹ thuật “mông má” hình ảnh của bạn. Game nội dung hay, hình cảnh xấu sẽ thất bại, trong khi hình ảnh đẹp đôi lúc lại tăng giá trị cho game. Điều này đã trời thành bình thường hiện nay. Vì vậy, muốn game bạn đẹp? Hãy cố gắng tạo các model đẹp.
- Các game nổi tiếng hiện nay đang sử dụng thư viện nào?
Các game 3D nổi tiếng như Tomb Raider, Half Life hay Warcraft III, Quake,… đều sử dụng cả hai thư viện. Hầu hết các game 2D mà chủ yếu là thể loại Strategy như AOE, hay thậm chí Diablo II lại chuộng DirectX hơn (dùng chủ yếu DirectDraw chứ không phải Direct3D hay OpenGL). Một số game cũ (như FF7, FF8) lại chỉ hỗ trơ OpenGL mà thôi.
- Tôi phải học DirectX hay OpenGL để làm game sao?
Ai ép bạn đâu? Bạn có thể dùng DirectX hay OpenGL, hay đồ hoạ thông thường để làm game của bạn, chỉ cần bạn thích và cảm thấy mình làm được với bộ thư viện đó. Bạn cũng có thể sử dụng textmode(!) để làm game như Caro hay Snake… hay tạo thư viện đồ hoạ riêng của mình, tuy nhiên cũng nên biết một câu “kinh điển” của giới lập trình như sau “Don’t try to reinventing the wheel”!!!
- Nếu tôi sử dụng OpenGL, tôi có nên sử dụng các extensions không?
Nếu bạn cẩn thận thì cứ xài. Không sao cả. Chỉ cần test xem card của user là card loại gì rồi sử dụng extensions tương ứng. No problem.
- Game nào là game “nặng” nhất hiện nay? Nó xài thư viện đồ họa gì?
Doom III của id Software. Game này sẽ ra mắt vào cuối năm nay. Doom III sử dụng một engine đồ hoạ cực mạnh được viết bằng OpenGL (bằng chứng cho thấy OpenGL không hề chết. Vivi OGL!!!). Với engine này, John Carmack (người đã từng phát triển Quake, game đã đặt viên đá 3D đầu tiên vào công nghệ game) tuyên bố sẽ sử dụng toàn bộ support của thế hệ card đồ hoạ mạnh nhất hiện nay. Bản giới thiệu đã được trình diễn vào đầu năm nay, trên một máy P4 2.2Ghz sử dụng card ATI 9700 Pro mà chỉ đạt được khoảng 30fps trên phân giải 640x480 (!!!).
- Còn âm thanh, video thì sao? OpenGL và Direct3D có hỗ trợ những thứ này không?
Rất tiếc là không. Tuy nhiên Direct3D là một thành phần trong DirectX, do đó bạn hoàn toàn có thể sử dụng DirectPlay, DirectSound vào game của bạn. OpenGL chỉ thuần là đồ hoạ, tuy nhiên bạn có thể sử dụng một số thư viện sound như OpenAL của Creative, hay thậm chí DirectSound của DirectX để thực hiện phần âm thanh. Không hề gì cả.

Để kết thúc
Hy vọng các câu hỏi trên đủ sức thuyết phục bạn chọn được thứ mà bạn cần. Nếu bạn vẫn không tìm được câu trả lời thì tôi cũng không biết giúp bạn như thế nào ;) Cách tốt nhất là hãy gieo đồng xu để quyết định ;)
Nếu bạn muốn học cả hai, điều đó cũng tốt. Hầu hết các game 3D hiện nay đều hỗ trợ cả hai thư viện, tức là người lập trình phải lập trình song ngữ OpenGL và Direct3D, và phải biết rõ cả hai như nhau. Thông thường Direct3D khó học hơn, nhưng chuyển từ Direct3D sang OpenGL thì dễ hơn nhiều so với điều ngược lại. Vậy chọn lựa học cái nào trước là quyền của bạn.
Tôi hy vọng với bài viết này (bài viết dài nhất từ trước tới nay của tôi trên diễn đàn này), các bạn sẽ có một cái nhìn tốt hơn về công nghệ phát triển game và lựa chọn được một con đường đi đúng của mình. Công việc phát triển game hiện chưa phát triển ở Việt Nam hiện nay, tuy nhiên hy vọng trong vài năm nữa, sự ra đời một game VN hay thậm chí một nền công nghiệp game hoàn toàn không phải là một ước mơ viễn vông. Tất cả là tuỳ thuộc vào bạn, vào tôi, vào chúng ta ngày hôm nay. Hãy cố gắng lên bạn nhé.
Mach2

bpmtri
19-05-2003, 18:04
Bài viết rất hay. Viva Mach2!

quaitieutu
19-05-2003, 18:37
Hông hiểu >>>đọc topic >>>close lại >>>>thành chuyên gia :D:D:D

CrazyBabe
23-05-2003, 11:34
Bài viết của Mach2 rất tuyệt, mình tâm đắc nhất ở một điểm bạn kết luận về tính tương thích ngược yếu kém của DX. Ban đầu mình viết engine bằng DX7, chuyển lên DX8 phải viết lại một số mã, đến lúc cài DX9 chạy thì thấy ra đi không trở lại (?) chán wé, cứ tưởng mình ngu wé nhưng mãi về sau mới biết là DX9 không hỗ trợ method đấy nữa. hu hu. Bây giờ mình đang viết lại bằng OGL. DX có phức tạp hơn OGL thật, nhưng đó chính lại là điểm mạnh của nó đó. Nhưng mình nghĩ về cơ bản thì hai flatform này cũng tương đồng nhau ở nhiều điểm, các bạn vẫn có thể "bắn hai tay như một" (Hè hè, dĩ nhiên là không cùng trượt đâu) với cả hai flatform này, việc bạn học cả hai cùng lúc đem sẽ lại hiệu quả vượt bậc đó (kinh nghiệm của mình thôi). Mọi người đều nói OGL có ưu điểm là chạy được trên Linux, nhưng chắc là các bạn chưa chạy thử nên không rõ hiệu năng, nhưng theo kinh nghiệm test của mình thì OGL chạy trên Linux không tuyệt như Window đâu. Với BeOS thì tương đương Window, còn các nền khác như là Mac hay FreeBSD thì mình chưa chạy thử. Nhưng mà mình biết nền tảng tốt nhất cho game là Window nên có lẽ chúng ta chỉ cần quan tâm đến lập trình trong Window là đủ. Nếu dùng DX thì được cái đồng bộ, nếu mà lập trình graphic bằng OGL mà lại dùng DXSound, DXPlay+DXInput thì cũng chả sao. Lập trình DX/OGL mà tạo các hiệu ứng thông thường (particle, shader, shadow, grid, LOD...) thì không khác nhau mấy (lập trình thôi - chứ hiệu quả thì có khác nhau đấy) nhưng đến các hiệu ứng cao cấp như smoothing, realtime lighting thì DX9 hiệu quả hơn nhiều (dĩ nhiên là đồ mới phải hơn chú OGL1.4 cũ mèm chớ). Các hiệu ứng này nếu bạn muốn thử so sánh thì xem thử các demo ở http://www.flipcode.com trong mục "Image of the day", chú ý là hệ thống của bạn phải có hỗ trợ VertexShader 2.0, hu hu, chứ như hùi xưa tui load zề rùi phải đi mua con card mới mới xem được, hic.

Mach2
25-05-2003, 10:52
Avenus3D của bạn bị ko tương thích DX phải ko? Lúc bạn nói ko tương thích DX9 mình cũng nghĩ là bị vậy. Còn cái engine mà có cái screenshot hồi trước bạn post trong Showcase (sunlight đó mờ, hình như mình post bài đầu lên dd này là hỏi về nó) làm bằng OGL giờ ra sao rồi?
Mình thấy dạo này box này ko có bài nào hấp dẫn hết. Bạn có rảnh ko, mình làm vài bài về kỹ thuật đồ hoạ trong 3D nhé?

Terminator
15-06-2003, 16:13
Ái chà mình cũng khoái cai lập trình đồ hoạ này lắm. Mình đang học OpenGL , vè hiệu ứng mình chỉ làm được 1 số thứ như trong các ví dụ ở nehe.gamedve.net như : particle,s hadow, lighting, flag, smooth shading thôi chả nghĩ ra cái gì mới cả. Mình đang làm 1 3DEngine và phải công nhận là làm engine thích thú hơn nhiều so với effect. Các bạn có biết nhiều về lập trình engine không bảo cho mình với.
- Hiện giờ mình đã làm được mô hình người chuyển động được trong 1 3DWorld và có thể thực hiện được 1 số động tác do mình tạo (Mình dựng cả 1 chương trình riêng độc lập với OpenGL để render 3DEngine nhưng chưa có độ sâu và hình render còn nhảy, sau này nhúng OpenGL vào thì thấy tuyệt quá)
- Các bạn có sách nào nói về OpenGL và DirectX dể hiểu không ? Nếu có thì mail cho mình qua ducthao84@yahoo.com với.


Thanks trước !

duynghia
24-06-2003, 14:54
Hí hí hí tui thấy học gì cũng không quan trọng nữa rồi, bỡi vì thheo tui người ta chỉ dùng DX hay GL đểbọc cái Engine của họ thôi bời vậy bây giờ các bạn hãy quan tâm đ61n LT hướng Engine di

Mach2
26-06-2003, 15:22
Bài của tôi chỉ nói về DX và OGL thôi. Ko nói chuyện làm game gì ở đây. 2 cái này là 2 cái dùng để lập trình đồ hoạ nói chung, do vậy nếu học nó bạn sẽ có thể ứng dụng trong nhiều chuyện khác, chứ ko nhất thiết phải là game. Xin đừng bàn cãi chuyện làm game thì cần học gì, cần biết gì, chuyện đó có nhiều thread khác bàn cãi rồi.

Terminator
27-06-2003, 16:18
Ncc365 là chú ký D2 phải không ?

quydo089
03-09-2003, 14:26
o day co ai bit ve demo va lap trinh do hoa ko ?Giup voi may anh

ngocquang19877
04-09-2003, 08:11
quá hay !quá giỏi!quá tuyệt vời!giờ mới bít thế giới rộng lớn đến chứng nào.
vỗ tay khen bác 1 cái

quydo089
04-09-2003, 13:18
muon hoc lap trinh do hoa dau tien fai hoc gi ! cac anh co ai bit ko?Neu ma ko bit thi em cung gia tu cai dien dan nay luon

quydo089
04-09-2003, 13:20
co ai co y kien khac ko ?? :dontgetit

Terminator
10-09-2003, 10:52
http://www.nehe.gamedev.net
la 1 trang hay ve lap trinh do hoa
Nen download file .chm cua nehe ve ma hoc offline

quydo089
13-09-2003, 13:39
http://www.nehe.gamedev.net
la 1 trang hay ve lap trinh do hoa
Nen download file .chm cua nehe ve ma hoc offline
trang do vo ko duoc ban oi

CrazyBabe
14-09-2003, 02:19
chính xác là:
http://nehe.gamedev.net
http://turbo.gamedev.net
http://www.gamedev.net
http://www.flipcode.com
Okie ?

Terminator
18-09-2003, 07:46
Sory ! Link cua minh hoi nham 1 ti

lich
27-12-2003, 20:42
xin lỗi cho mình hỏi 1 tí: bạn nói OpenGL ra đời trước khi OOP ra đời, vậy mình có thể lập trình OGL trong DOS thông qua BC++ 3.1 được không, vì BC++ 3.1 là 1 ngôn ngữ OOP ra đời sau OGL nên có thể lắm chứ. Nếu có thì bạn có thể chỉ cho mình cách include thư viên OGL vào chương trình của mình nhé. Và chuẩn OGL hiện nay ta có thể tìm ở đâu vậy, vì mình là người mới nên không biết phải bắt đầu từ đâu cả. (rất cám ơn bạn, bài viết giới thiệu rất hay)

Mach2
27-12-2003, 22:44
hi, OpenGL ko hỗ trợ DOS nên bạn ko thể dùng trong BC 3.1 được đâu. OpenGL thọat đầu được sử dụng trong các hệ SGI nên mình mới nói là vậy :cool
Thông tin cập nhật về OGL bạn có thể tìm trên www.opengl.org. Đây là HQ của OGL đó mà.

Yamakun
11-03-2004, 01:02
www.32bits.co.uk. down het huong dan trong nay roi vo links !