2009-11-07 62 views
12

Tôi là lập trình viên C++ với trải nghiệm lập trình máy chủ rất phong phú. Tuy nhiên tôi khá chán vào lúc này và tôi quyết định giải quyết một lĩnh vực mới: lập trình trò chơi 3D, cho mục đích học tập. Ngoài ra tôi nghĩ rằng dự án học tập này có thể trở thành tài liệu tiếp tục tốt trong tương lai nên tôi quyết định làm việc trong lĩnh vực này.Tôi nên sử dụng khung đồ họa 3D nào cho một công cụ trò chơi thế giới thực?

Thay vì tạo một công cụ 3D từ đầu, tôi quyết định mô phỏng chính xác như tôi có thể hiện có: World of Warcraft's. Nếu bạn tò mò là tại sao (bạn có thể bỏ qua):

  • Đó là một thành công trò chơi thế giới thực
  • Tất cả các kết cấu bản đồ, mô hình và những gì không được đã được thực hiện (Tôi không quan tâm đến việc học tập làm thế nào để thực sự vẽ một kết cấu với photoshop hoặc bất cứ điều gì)
  • Các định dạng tệp của chúng đã được thiết kế hoàn toàn ngược lại
  • Đã có một dự án nguồn mở giống hệt (wowmapview) mà tôi có thể xem xét .

ok, đó là một lời nói đầu dài .. Bây giờ, câu hỏi chính của tôi là: Tôi có nên sử dụng DirectX, OpenGL, thư viện bao bọc như sdl hay không?

Cách nào được sử dụng nhiều nhất trong thế giới thực?

Và, điều gì khác khiến tôi bối rối: World of Warcraft dường như đang sử dụng cả hai! Trong thực tế, thông thường nó sử dụng DirectX, nhưng bạn có thể sử dụng opengl bằng cách khởi động nó bằng công tắc "-opengl" thông qua dòng lệnh.

Điều này có phổ biến trong trò chơi không? Tại sao họ làm điều đó? Tôi tưởng tượng nó là rất nhiều công việc và từ sự hiểu biết của tôi không ai sử dụng OpenGL anyway (rất rất ít người biết về việc chuyển đổi bí mật ở tất cả).

Nếu điều gì đó thường được thực hiện, người lập trình thường tạo công cụ "wrapper" 3D của riêng họ, giống như SDL được sản xuất trong nhà và dựa trên công tắc/#defines/whatnot quyết định chức năng API nào cuối cùng gọi (DirectX hoặc OpenGL) ? Hoặc là chức năng này đã được xây dựng trong sdl (bạn có thể chuyển đổi giữa DirectX và OpenGL theo ý muốn)?

Và cuối cùng, bạn có bất kỳ sách nào để đề xuất không?

Cảm ơn!

+5

"Tại sao họ làm điều đó?" Vì Mac OSX không hỗ trợ DirectX? –

+3

SDL chỉ đơn thuần là một lớp trừu tượng nền tảng, nó thay thế cả OpenGL lẫn DirectX. Tuy nhiên, khi SDL được sử dụng, nó thường được sử dụng với OpenGL, vì cả hai thư viện nền tảng chéo. Cũng đáng chú ý là SDL không cung cấp một bộ công cụ widget, vì vậy nếu đó là một yêu cầu (không phải là rất phổ biến trong trò chơi 3D toàn màn hình), một cái gì đó giống như Qt có thể là một lựa chọn tốt hơn cho một ứng dụng nền tảng chéo. – codelogic

+1

@gf: điểm tốt. Làm cho tôi tự hỏi tại sao họ không hỗ trợ linux nguyên bản kể từ khi họ đã trải qua tất cả các rắc rối để làm cho OpenGL làm việc cho mac .. chỉ nên cần những thay đổi tương đối tầm thường. ồ, đoán là tôi sẽ không bao giờ tìm ra. –

Trả lời

30

Tôi nhận thấy bạn đã chấp nhận câu trả lời nhưng tôi nghĩ điều này xứng đáng với một số nhận xét khác. Xin lỗi để báo cho bạn ra khỏi trật tự, tôi trả lời bởi những gì tôi nghĩ là quan trọng.

Thay vì tạo một công cụ 3D từ đầu, tôi quyết định mô phỏng chính xác như tôi có thể có sẵn: World of Warcraft's.

Tuy nhiên, tôi muốn tập trung vào công cụ dựng hình 3D và thực tế chứ không phải giao diện, vì vậy tôi không nghĩ mình sẽ sử dụng nó [lua] cho dự án này.

Từ hai đoạn này, tôi có thể cho bạn biết rằng bạn không cố gắng mô phỏng công cụ trò chơi. Chỉ Phần phụ trợ hiển thị 3D. Nó không phải là điều tương tự, và phần phụ trợ hiển thị là một phần rất nhỏ so với công cụ trò chơi đầy đủ.

này, bằng cách này, có thể giúp trả lời một câu hỏi của bạn:

World of Warcraft dường như được sử dụng cả hai! Trong thực tế, thông thường nó sử dụng DirectX, nhưng bạn có thể sử dụng opengl bằng cách khởi động nó bằng công tắc "-opengl" thông qua dòng lệnh.

Đúng, họ đã triển khai cả hai. Số lượng công việc để làm điều đó là không thể bỏ qua, nhưng kết xuất hiển thị, theo kinh nghiệm của tôi, tối đa là 10% tổng số mã, thường ít hơn. Vì vậy, nó không phải là việc xúc phạm để thực hiện nhiều cái.

Hơn nữa, phần lập trình của công cụ trò chơi hiện nay không phải là đoạn lớn nhất. Phần lớn các kịch bản lua được xem xét ở khía cạnh đó, ví dụ:

Đối với WoW, hỗ trợ OSX có nghĩa là OpenGL. Vì vậy, họ đã làm điều đó. Họ cũng muốn hỗ trợ phần cứng cũ hơn ... Vì vậy, họ hỗ trợ phần cứng cấp DX8. Đó là 3 chương trình phụ trợ. Tôi không biết họ thực sự triển khai bao nhiêu, nhưng tất cả đều tập trung vào cơ sở khách hàng mà họ muốn tiếp cận.

Nhiều back-end trong một công cụ trò chơi là thứ ít nhiều cần thiết để mở rộng cho tất cả các cạc đồ họa/hệ điều hành/nền tảng. Tôi chưa thấy một động cơ trò chơi thực thực sự nào không hỗ trợ nhiều phụ trợ (ngay cả tựa đề của bên thứ nhất có xu hướng hỗ trợ một back-end thay thế cho mục đích gỡ lỗi).

ok, đó là một lời nói đầu dài .. Bây giờ, câu hỏi chính của tôi là: Tôi có nên sử dụng DirectX, OpenGL, thư viện bao bọc như sdl hay không?

Vâng, điều này phụ thuộc rất lớn vào những gì bạn muốn thoát ra khỏi nó. Tôi có thể thêm rằng danh sách lựa chọn của bạn không phải là khá hoàn chỉnh:

  • DirectX9
  • DirectX10
  • DirectX11
  • OpenGL < 3.1 (trước API NỮA được lấy ra)
  • OpenGL> = 3.1
  • OpenGL ES 1.1 (chỉ khi bạn cần.Nó không phải lập trình)
  • OpenGL ES 2,0

Yep, những API đủ khác nhau mà bạn cần phải quyết định cái nào bạn muốn xử lý.

Nếu bạn muốn tìm hiểu các khái niệm cơ bản về dựng hình 3D, bất kỳ thứ gì trong số đó đều có thể hoạt động. OpenGL < 3.1 có xu hướng ẩn nhiều thứ mà cuối cùng phải xảy ra trong mã người dùng cho các mã khác (ví dụ: thao tác ma trận, xem this plug).

DX SDK đi kèm với rất nhiều mẫu giúp hiểu khái niệm cơ bản, nhưng chúng cũng có xu hướng sử dụng các tính năng mới nhất và tuyệt vời nhất của DX khi nó không nhất thiết cần thiết khi bắt đầu (ví dụ: sử dụng hình học shader để render sprites. Mặt khác, hầu hết các hướng dẫn GL đều có xu hướng sử dụng các tính năng cơ bản không thực hiện trên phần cứng hiện đại (ví dụ: glBegin/glEnd, select/picking, ... xem danh sách những thứ đã bị xóa khỏi GL 3.1 hoặc this other plug) và có xu hướng ghép các khái niệm sai cho rất nhiều thứ.

Cái nào được sử dụng nhiều nhất trong thế giới thực?

Đối với trò chơi, DirectX9 là tiêu chuẩn hiện nay trong thế giới PC. Bởi một lợi nhuận xa.

Tuy nhiên, tôi hy vọng DirectX11 sẽ chiếm được nhiều thị phần hơn vì nó cho phép một số công việc đa luồng hơn. Thật không may phức tạp hơn đáng kể so với DX9.

không ai sử dụng OpenGL anyway (rất ít người biết về công tắc bí mật).

Hỏi chủ sở hữu máy tính những gì họ nghĩ.

Câu hỏi phụ, bạn có thực sự nghĩ các nhà cung cấp phần cứng sẽ tiêu tốn năng lượng trong trình điều khiển OpenGL nếu đây thực sự là trường hợp (tôi nhận ra tôi đã khái quát nhận xét của bạn, xin lỗi)? có những tập quán thế giới thực của nó. Mặc dù không có nhiều trò chơi. Và Apple làm cho OpenGL phù hợp hơn thông qua iphone (cũng là OpenGL ES, thực sự).

Nếu đó là một cái gì đó thường được thực hiện, đừng lập trình viên thường tạo cơ 3d riêng của họ "wrapper",

Nó thường là một phần đầy đủ của thiết kế động cơ. Tâm trí bạn, nó không trừu tượng các API ở cùng cấp độ, nó thường là nhiều hơn tại một "vẽ này với tất cả các chuông và còi của nó trên đó". Thuật toán kết xuất nào được áp dụng trên bản vẽ đó có xu hướng trở lại cụ thể.

Điều này, tuy nhiên, rất phụ thuộc vào công cụ trò chơi. Nếu bạn muốn hiểu rõ hơn, bạn có thể nhìn vào UE3, nó chỉ có released free (beer) for non-commercial use (Tôi chưa xem nó, vì vậy tôi không biết liệu chúng có lộ ra các phần phụ trợ hay không, nhưng nó đáng xem). Để lấy lại nhận xét của tôi rằng công cụ trò chơi không chỉ có nghĩa là 3D, look at this.

+3

+1 cho câu trả lời rất chu đáo và chu đáo! –

+1

Câu trả lời hay, đánh dấu câu trả lời này là đã được chấp nhận. Cảm ơn ! –

+0

wow, tôi thậm chí không biết bạn có thể thay đổi câu trả lời được chấp nhận sau khi thực tế. – Bahbar

3

Tôi nghĩ rằng lợi ích chính của việc sử dụng OpenGL trên DirectX là tính di động. DirectX chỉ chạy trên các cửa sổ. Tuy nhiên, điều này thường không phải là một vấn đề (nhiều trò chơi chỉ chạy trên Windows).

DirectX cũng cung cấp các thư viện khác hữu ích cho các trò chơi không liên quan đến đồ họa như âm thanh và đầu vào. Tôi tin rằng có tương đương thường được sử dụng với OpenGL nhưng tôi không nghĩ rằng chúng thực sự là một phần của OpenGL.

Nếu bạn định khóa cửa sổ với DirectX và bạn sẵn sàng/thích học C# và mã được quản lý, tôi đã tìm thấy XNA và nền tảng cực kỳ dễ học. Nó cho phép bạn tìm hiểu hầu hết các khái niệm mà không làm việc với rất nhiều chi tiết thực sự phức tạp của DirectX (hoặc OpenGL). Bạn vẫn có thể sử dụng mã đổ bóng và có toàn bộ sức mạnh của DirectX nhưng trong một môi trường thân thiện hơn nhiều. Nó sẽ là ý kiến ​​của tôi nhưng một lần nữa, bạn phải chuyển sang C# (nhớ bạn, bạn cũng có thể đặt nó vào khi bạn đang tiếp tục).

+0

DirectX không còn hỗ trợ C#: http://social.msdn.microsoft.com/Forums/en-US/gametechnologiesdirectx101/thread/e9f458e0-65c6-4936-9af4-4276fc92f111. Phiên bản cuối cùng tôi đã sử dụng với hỗ trợ là 9.0c –

+2

+1 lớn cho XNA cho nền người hỏi và khả năng ứng dụng trong tương lai của công nghệ – gn22

+0

Đúng, bạn không thể lập trình trực tiếp DirectX với C#, XNA là thư viện C#, sử dụng DirectX bên dưới.Nó không giống như DirectX và hiện đang được sử dụng rất nhiều, phiên bản 3.0 vừa mới xuất hiện gần đây. –

1

Bạn có thể muốn xem xét một số dự án đóng gói api 3d mức thấp ở giao diện cấp cao hơn là độc lập api như Ogre3D. Khi bạn đang làm điều này để tìm hiểu tôi giả sử bạn có thể sẽ thú vị hơn trong việc thực hiện các chi tiết cấp thấp cho mình, nhưng bạn có thể có thể học được rất nhiều từ một dự án như vậy.

+1

Hoặc irrlicht, hoặc opencenegraph –

+0

Thật vậy, tất cả đều tốt. – jcoder

-1

Tôi đang làm một số công việc OpenGL ngay bây giờ (trên cả Windows và Mac).

So với chương trình trò chơi nửa đêm của tôi bằng cách sử dụng công cụ Unity3D, sử dụngOpenGL là một chút giống như phải chặt cây của riêng bạn để tạo một căn nhà so với mua vật liệu.

Unity3D chạy trên mọi thứ (Mac, PC và iPhone, trình phát Web, v.v) và cho phép bạn tập trung vào những gì tạo ra trò chơi, trò chơi. Để đầu nó đi, nó nhanh hơn bất cứ điều gì tôi có thể viết. Bạn mã cho nó trong C#, Java (EDIT: làm cho rằng JavaScript) hoặc Boo . (CHỈNH SỬA: Hỗ trợ Boo đã bị xóa)

Tôi vừa sử dụng Unity để tạo bản trình diễn cho khách hàng muốn có thứ gì đó được tạo trong OpenGL để nó cũng có thế giới thực.

-Chris

PS: Phiên bản Indie Unity gần đây đã trở thành miễn phí.

+1

Chỉnh sửa nhỏ: Bạn có thể lập trình bằng Javascript chứ không phải Java! :-) –

+0

Cảm ơn Thiago. Tôi đã sửa nó 7 năm sau ... –

0

nếu bạn thực sự chỉ quan tâm đến phần hiển thị, tôi có thể đề xuất ogre3d. nó sạch sẽ, C++, thử nghiệm và đa nền tảng. tôi đã sử dụng nó trong hai dự án và so sánh với các trải nghiệm khác (ví dụ: torque3d), tôi thích hỗ trợ tốt (hướng dẫn/wiki/diễn đàn) và đường cong học tập không quá dốc. tôi nghĩ rằng ai đó cũng có thể học được rất nhiều bằng cách nhìn vào mã nguồn và các khái niệm mà họ đã sử dụng trong thiết kế. cũng có một cuốn sách đi kèm, có một chút lỗi thời, nhưng tốt cho việc bắt đầu

vấn đề là, bạn sẽ suy nghĩ bên trong động cơ này và chẳng mấy chốc bạn sẽ cần trò chơi (giờ, sự kiện) các yếu tố để mô phỏng và kiểm tra hiệu ứng của bạn hoặc bất cứ điều gì bạn muốn làm. vì vậy bạn sẽ kết thúc làm việc xung quanh thiếu sót ogre3ds (nó không phải là một công cụ trò chơi) và thực hiện một mình hoặc sử dụng một middleware khác.

vì vậy nếu bạn thực sự muốn chạm vào dựng hình 3D trước, tôi sẽ lấy một số sách đồ họa máy tính (đá quý gpu, shaderx) và xem một số hướng dẫn và bản trình diễn trên web và bắt đầu xây dựng khung cơ bản của riêng tôi. đây là trải nghiệm và tôi nghĩ bạn sẽ học được nhiều nhất từ ​​cách tiếp cận này. ít nhất tôi đã làm ...

Các vấn đề liên quan