Liệu tôi có học OpenGL hay Direct3D không?


11

Có phải sự khác biệt giữa hai API chi tiết triển khai nhỏ này có nghĩa là một khi tôi đã học được một cái tôi có thể sử dụng nó cho mọi thứ không? Hoặc có những lý do để học cái này hơn là cái kia nếu tôi muốn có thể sử dụng nó nói chung mà không phải học lại API khác trong tương lai? Là một hay khác tổng quát hơn?

Đặc biệt tôi muốn có thể viết cho bất kỳ card đồ họa nào, vì vậy mã không bị hạn chế chỉ chạy trên một thẻ manuafactker cụ thể hoặc một mô hình cụ thể. Tôi cũng muốn có thể viết mã vẫn hoạt động trong trường hợp không có card đồ họa (mặc dù chậm hơn).

Có sự khác biệt về cách mã di động sẽ trên các nền tảng khác nhau (hệ điều hành / kiến ​​trúc) không? Tôi quan tâm đến sự sẵn có của các thư viện khác hoạt động với những thư viện này và liệu cái này hay cái kia dẫn đến ít hạn chế cấp phép hơn trong môi trường rộng lớn hơn. Bất cứ điều gì có thể đo lường được sẽ tạo ra sự khác biệt cho dù một trong số chúng có thể là người duy nhất tôi học mà không hạn chế tôi.


2
câu trả lời của ratchet freak là một câu hỏi hay. Nếu bạn muốn học Direct3D, bạn có thể đọc cuốn sách miễn phí "Đường ống đồ họa Direct3D" của tôi . Các chi tiết API chủ yếu là Direct3D9, nhưng các khái niệm là như nhau. Vấn đề là, các khái niệm về lập trình đồ họa 3D không thực sự thay đổi kể từ cuối những năm 1960. Các API để thể hiện các khái niệm đó đã trở nên thông minh hơn nhiều.
hợp pháp hóa

Câu trả lời:


9

Tôi không nghĩ nó quan trọng lắm, API nào bạn muốn sử dụng khi nghiêng về "đồ họa chương trình". Những điều quan trọng hơn để tìm hiểu là các khái niệm điển hình bạn sử dụng khi làm việc với các cảnh 3D. Ví dụ, bạn muốn tìm hiểu cách viết Biểu đồ cảnh đơn giản (và sau này tinh vi hơn). Các khái niệm này quan trọng hơn nhiều so với các tên phương thức API cụ thể mà bạn phải gọi.

So sánh nó khi học cách viết chương trình. Nếu bạn khá giỏi trong việc viết các chương trình trong ví dụ Java, bạn sẽ không gặp nhiều khó khăn khi học C ++, Objective-C, Swift hoặc một số ngôn ngữ hướng đối tượng khác. Bởi vì đó là những khái niệm và suy nghĩ mà bạn học được.

Sự lựa chọn giữa OpenGL, Direct3D và Metal chủ yếu là sự lựa chọn, hệ điều hành mà bạn nhắm tới. Direct3D chủ yếu có sẵn trên Windows, Metal trên OS X và iOS và OpenGL được hỗ trợ trên hầu hết các hệ thống bao gồm OS X, iOS, Windows và Linux.

Card đồ họa có thể ít ảnh hưởng đến quyết định này vì tôi không biết thẻ chỉ hỗ trợ một hoặc hai. Nếu bạn không có card đồ họa chuyên dụng, thì kết xuất trong thời gian thực sẽ là vấn đề sớm. Mặc dù Đồ họa HD của Intel và người bạn đồng hành AMD có thể đã làm được khá nhiều việc.

Vì vậy, chọn nền tảng của bạn.


Tuyên bố miễn trừ trách nhiệm: Hiện tại, tôi không sử dụng Direct3D hay Metal.


2
> "Nếu bạn khá giỏi trong việc viết chương trình, ví dụ Java, bạn sẽ không gặp nhiều khó khăn khi học C ++" - điều này không đúng. Mọi người sẽ gặp rắc rối lớn khi học và sử dụng C ++. So sánh nó với Java hoặc bất kỳ ngôn ngữ an toàn nào khác là hoàn toàn không phù hợp. Đối với các ngôn ngữ khác mà bạn đã liệt kê (Objective-C, Swift hoặc một số ngôn ngữ hướng đối tượng khác), câu nói đó hầu hết là đúng.
Tên hiển thị

9

Chúng tôi hiện đang trong quá trình chuyển đổi các mô hình API.

Phương pháp cũ của bộ đệm ràng buộc, đồng phục, thuộc tính, bố cục và chương trình dưới dạng (ẩn) trạng thái toàn cầu và gửi các bản vẽ với trạng thái đó là phổ biến trên D3D11 và OpenGL. Tuy nhiên, nó có một lượng lớn chi phí (trong trạng thái xác minh và không biết chương trình muốn làm gì cho đến phút cuối cùng). Họ cũng không phải là chủ đề an toàn (đối với hầu hết các phần).

Đây là lý do tại sao apis mới đã xuất hiện (hoặc sắp ra mắt) D3D12, Vulkan và Metal là nổi bật nhất. Các API này cung cấp thêm quyền kiểm soát cho chương trình và cho phép nó khai báo trước những gì nó muốn làm bằng cách sử dụng bộ đệm lệnh. Họ cũng cho phép bạn quản lý tài nguyên của riêng bạn (dữ liệu đỉnh, kết cấu, ...) trực tiếp hơn nhiều. Sử dụng chúng với nhiều là nhiều hơn về phía trước.

Sự lựa chọn giữa cũ và mới dựa trên mức độ bạn có thể quản lý bộ nhớ video bạn phân bổ và xây dựng bộ đệm lệnh.

  • Nếu bạn muốn một cái gì đó "chỉ hoạt động" ngay cả trên phần cứng cũ thì API trường học cũ sẽ tốt hơn; họ cũng được biết đến nhiều hơn và bạn sẽ nhận được nhiều sự giúp đỡ hơn trên mạng.

  • Mặt khác, nếu bạn có thể xử lý tính chất không đồng bộ của việc gửi các lệnh và đừng ngại phải theo dõi tất cả các bộ đệm mà bạn phân bổ. Sau đó, các API mới có thể là một cái gì đó cho bạn.


6
Các API đồ họa rõ ràng mới không thực sự được thiết kế để tiêu thụ bởi các lập trình viên đồ họa trung bình, chúng dành cho những người làm công việc cơ sở hạ tầng trong động cơ hoặc cho những người thực sự cần hiệu năng. Họ cung cấp cho bạn một khẩu súng lớn hơn nhiều và chĩa thẳng vào chân bạn.
porglezomp

3

Cá nhân tôi không nghĩ nó quan trọng lắm. Chỉ cần chọn một phù hợp với dự án của bạn. Tôi đã sử dụng cả D3D và OpenGL trong quá khứ. Đó là các khái niệm quan trọng. Bất cứ điều gì bạn lấy, bạn cần phải hiểu (ví dụ):

  • Hoạ tiết là gì và cách chúng được GPU sử dụng.
  • Các khái niệm cơ bản về phát triển đồ họa (Vertice, Primitive, Fragment, v.v.)
  • Hệ thống camera hoạt động như thế nào (ma trận MVP trong OpenGL chẳng hạn).
  • Shader là gì và làm thế nào để sử dụng chúng đúng cách.
  • GPU hoạt động khác nhau như thế nào so với CPU trên máy của bạn.
  • Sự khác biệt giữa mô hình bộ nhớ của GPU và mô hình bộ nhớ của CPU là gì.
  • Những gì nên được thực hiện trên CPU và những gì nên được giảm tải cho GPU để xử lý.

Như những người khác đã đề cập ở đây, chúng tôi đang trong giai đoạn chuyển đổi sang một bộ API mới (Vulkan, Metal, v.v.) vì vậy tại thời điểm này nếu bạn hoàn toàn mới với Phát triển đồ họa, có lẽ tập trung vào GLSL là một ý tưởng hay vì Vulkan sẽ tận dụng lợi thế của nó là tốt.

Về tính di động, D3D chỉ là Windows (Có tin đồn rằng dự án Wine đang cố gắng để D3D hoạt động trong Linux nhưng không có gì khả thi cho đến nay). OpenGL là đa nền tảng. Nếu bạn muốn di động, thì OpenGL ES là một tùy chọn có sẵn. Tất nhiên cả OpenGL và OpenGL ES đều có các phiên bản khác nhau không được hỗ trợ bởi tất cả các nền tảng.

Vào cuối ngày, tất cả các API truy cập vào cùng một phần cứng trên máy của bạn, đó chỉ là vấn đề "làm thế nào" họ truy cập nó.


Direct3D cũng là thứ bạn sẽ sử dụng nếu bạn đang lập trình cho bất kỳ máy chơi trò chơi Xbox nào.
hợp pháp hóa

Bạn có ý nghĩa gì bởi "không có gì khả thi"? Wine chạy hàng trăm chương trình dựa trên D3D mà không gặp vấn đề gì, và đã làm như vậy trong nhiều năm. Tất nhiên có lỗi và các phần chưa được thực hiện, nhưng điều đó không làm cho toàn bộ API không thể sử dụng được.
Ruslan

0

Tôi sẽ nói vài lời về kết xuất mà không cần card đồ họa.

Niether OpenGL hay DirectX thực sự cần một card đồ họa. Một triển khai có thể được tăng tốc đầy đủ phần mềm.

Đối với OpenGL trong Linux, có trình rasterizer phần mềm Mesa. Theo kinh nghiệm của tôi, nó hoạt động tốt miễn là bạn không quá khó khăn khi kết hợp các tính năng lạ (danh sách hiển thị + mảng đỉnh được lập chỉ mục). Tôi tưởng tượng danh sách các lỗi thực tế của họ là dặm cao. Hãy chắc chắn để làm thử nghiệm liên tục!

Tôi có ít kinh nghiệm sử dụng OpenGL trong Windows. Chỉnh sửa câu trả lời nếu bạn biết bất cứ điều gì!

DirectX SDK được phân phối với một trình rasterizer phần mềm gọi là "rasterizer tham chiếu". Nó chủ yếu là để gỡ lỗi theo ý kiến ​​của tôi nhưng tôi biết ít nhất một người bạn sử dụng trình rasterizer tham chiếu khi phát triển DX11 trên máy tính xách tay chỉ có khả năng DX10. Như đã đề cập trong các câu trả lời khác DirectX chỉ dành cho Microsoft.


Theo kinh nghiệm của tôi, sử dụng card đồ họa tích hợp sẽ đủ tốt cho hầu hết sự phát triển OpenGL trên Windows, chỉ cần đảm bảo rằng nó hỗ trợ phiên bản OpenGL gần đây.
akaltar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.