Fixed-Function vs Shader: Cái nào dành cho người mới bắt đầu?


16

Tôi hiện đang học đại học về khoa học máy tính. Mặc dù tôi có kế hoạch sử dụng một công cụ hiện có tại một số điểm để tạo ra một trò chơi nhỏ, mục tiêu của tôi ngay bây giờ là hướng tới việc học các nguyên tắc cơ bản: cụ thể là lập trình 3D. Tôi đã thực hiện một số nghiên cứu về sự lựa chọn giữa DirectX và OpenGL và tâm lý chung xuất phát từ đó là dù bạn chọn OpenGL hay DirectX làm nền tảng bánh xe đào tạo của bạn, rất nhiều kiến ​​thức có thể chuyển sang nền tảng khác . Do đó, vì OpenGL được hỗ trợ bởi nhiều hệ thống hơn (có thể là một lý do ngớ ngẩn để chọn học gì), tôi đã quyết định rằng tôi sẽ học OpenGL trước.

Sau khi tôi đưa ra quyết định học OpenGL, tôi đã nghiên cứu thêm và tìm hiểu về một sự phân đôi mà lúc nào đó tôi không biết: OpenGL chức năng cố định so với OpenGL dựa trên lập trình hiện đại. Lúc đầu, tôi nghĩ rằng đó là một lựa chọn rõ ràng rằng tôi nên chọn học OpenGL dựa trên shader vì đó là thứ được sử dụng phổ biến nhất trong ngành công nghiệp ngày nay. Tuy nhiên, sau đó tôi tình cờ thấy chương trình Học tập đồ họa 3D hiện đại rất nổi tiếng của Jason L. McKesson, nằm ở đây: http : //www.arcsynt tổng hợp.org / gltut /

Tôi đọc qua các bit giới thiệu và trong phần "Giới thiệu về cuốn sách này", tác giả tuyên bố:

"Đầu tiên, phần lớn những gì học được với phương pháp này chắc chắn phải bị bỏ rơi khi người dùng gặp phải vấn đề đồ họa phải giải quyết bằng khả năng lập trình. Khả năng lập trình xóa sạch gần như tất cả các đường ống chức năng cố định, vì vậy kiến ​​thức không dễ dàng chuyển giao."

nhưng đồng thời cũng làm cho trường hợp chức năng cố định cung cấp một đường cong học tập dễ dàng hơn, ngay lập tức hơn cho người mới bắt đầu bằng cách nêu:

"Nó thường được coi là dễ nhất để dạy các lập trình viên đồ họa tân sinh bằng cách sử dụng đường ống chức năng cố định."

Đương nhiên, bạn có thể thấy lý do tại sao tôi có thể bị mâu thuẫn về mô hình nào cần học: Tôi có dành nhiều thời gian để học (và sau đó không học) các cách của chức năng cố định hay tôi chọn bắt đầu với shader? Mối quan tâm chính của tôi là các shader lập trình hiện đại bằng cách nào đó yêu cầu lập trình viên phải hiểu đường ống chức năng cố định, nhưng tôi nghi ngờ đó là trường hợp.

TL; DR = Là một lập trình viên đồ họa game đầy tham vọng, việc học lập trình 3D thông qua chức năng cố định hay lập trình dựa trên shader hiện đại là điều tôi quan tâm nhất?


Có một số câu hỏi tương tự như vậy ...
phải

"nhưng đồng thời cũng làm cho trường hợp chức năng cố định cung cấp một đường cong học tập dễ dàng hơn, ngay lập tức hơn cho người mới bắt đầu bằng cách nêu:" Tôi tò mò. Làm thế nào chính xác mà làm cho trường hợp đó? Bởi vì trích dẫn nói rõ ràng, "Nó thường được coi là dễ nhất ..." (nhấn mạnh thêm). Như trong, nó có thể được coi là đúng, nhưng điều đó không có nghĩa là nó đúng.
Nicol Bolas

Vâng, đó là một cách khó hiểu để diễn đạt điều đó.
Rob chào

Đường ống chức năng cố định đã không được hỗ trợ trong cả OpenGL và DirectX, vì vậy tôi sẽ không lãng phí thời gian của bạn với nó. Các shader cơ bản khá đơn giản và chắc chắn không phức tạp hơn việc hiểu đủ để bối cảnh kết xuất hoạt động.
3Dave

Câu trả lời:


30

Tôi không mua lập luận rằng bắt đầu dễ dàng hơn với các công cụ chức năng cố định. Đó có thể là trường hợp chức năng cố định cho phép bạn thực hiện một số việc với ít mã hơn - ví dụ như trong OpenGL chức năng cố định, bạn có thể nhận được một số ánh sáng / bóng mờ rất cơ bản bằng cách thực hiện glEnable(GL_LIGHTING)và một vài cuộc gọi khác. Vấn đề là ngay khi bạn muốn một cái gì đó hơi khác biệt - ánh sáng trên mỗi pixel, thay vì chiếu sáng theo đỉnh - bạn phải từ bỏ hoàn toàn các công cụ chức năng cố định và viết một shader để thực hiện cả bất kỳ chức năng cố định nào bạn đang sử dụng trước đây, cộng với bất cứ điều gì bạn muốn thay đổi.

Có vẻ như nó sẽ đơn giản hơn và ít gây nhầm lẫn hơn khi sử dụng shader toàn bộ thời gian. Các shader cần thêm một chút công việc thiết lập vì bạn có một tệp nguồn riêng cần được tải và biên dịch, một số lệnh gọi C bổ sung để tra cứu và thiết lập các tham số, v.v. Nhưng một khi bạn đã có một shader đi, đó là điều dễ nhất để mã hóa một vài hiệu ứng khác nhau, thử các ý tưởng khác nhau, v.v. Và bạn không cần quan tâm đến việc giới hạn của hệ thống chức năng cố định ở đâu và liệu nó có thể hoặc không thể làm những gì bạn muốn; shader có thể làm bất cứ điều gì bạn có thể viết mã, sửa đổi các giới hạn thông thường về hiệu suất và bộ nhớ.


Thật tuyệt, cảm ơn vì đã phản hồi. Tôi rất có thể cuối cùng sẽ đi đúng cho shader.
Rob chào

3
+1 - nó cũng giống như "Học C ++" so với "Học CƠ BẢN". Bạn sẽ mất nhiều thời gian hơn để học C ++ nhưng về lâu dài bạn sẽ học được nhiều hơn.
Jonathan Dickinson

3
Tôi muốn giới thiệu opengl-tutorial.org . Trang web giải thích những điều cơ bản khá độc đáo và chỉ sử dụng các shader.
Exilyth

3

Tôi sẽ nói để bắt đầu với chức năng cố định trên GLUT. Tôi sẽ không nói nhiều về điều này, nhưng ý tưởng đằng sau các shader khá phức tạp và kiến ​​thức cần thiết là lập trình 3d cơ bản (ví dụ: tạo đỉnh và ma trận biến đổi, v.v.). Có rất nhiều nơi bạn có thể sử dụng shader, có nhiều thứ hơn để viết mã.

Kiểm tra hướng dẫn của tôi , và những cái lighthouse3d


2

Tôi thứ hai đi thẳng cho shader. Nó không thực sự khó khăn hơn nhiều để thiết lập, và khi bạn vượt qua rào cản đầu tiên mà bạn có toàn quyền trong tầm tay của bạn.

Quan trọng hơn, bạn sẽ thấy rằng lập trình shader phù hợp hơn với các phương trình toán học bạn thấy trong sách và bài giảng đồ họa ở trường đại học.


0

Tôi sẽ đề nghị sử dụng đường ống chức năng cố định làm xương sống của chương trình của bạn. Tôi thấy nó dễ dàng hơn khi có thứ gì đó xuất hiện bằng cách sử dụng nó thay vì các shader hoàn toàn. Sau đó, khi bạn biết rằng bạn đã không làm rối tung các đỉnh hoặc quy tắc của mình, bạn có thể từ từ nhưng chắc chắn tiến bước vào thế giới bóng râm.

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.