Cách tiếp cận thực tế nhất có vẻ là bỏ qua hầu hết chức năng OpenGL không áp dụng trực tiếp (hoặc chậm hoặc không được tăng tốc phần cứng hoặc không còn phù hợp với phần cứng nữa).
OOP hay không, để làm cho một số cảnh đó là những loại khác nhau và các tổ chức mà bạn thường có:
Geometry (mắt lưới). Thông thường, đây là một mảng các đỉnh và một loạt các chỉ mục (tức là ba chỉ số cho mỗi tam giác, còn được gọi là "danh sách tam giác"). Một đỉnh có thể ở một số định dạng tùy ý (ví dụ: chỉ có vị trí float3; vị trí float3 + float3 bình thường; vị trí float3 + float3 bình thường + float2 texcoord; v.v ...). Vì vậy, để xác định một miếng hình học bạn cần:
- định nghĩa nó là định dạng đỉnh (có thể là một bitmask, một enum từ một danh sách các định dạng; ...),
- có mảng các đỉnh, với các thành phần của họ xen kẽ ("mảng xen kẽ")
- có mảng tam giác.
Nếu bạn ở trong vùng đất OOP, bạn có thể gọi lớp này là Lưới.
Vật liệu - những thứ xác định cách một phần hình học được hiển thị. Trong một trường hợp đơn giản nhất, điều này có thể là một màu của đối tượng, ví dụ. Hoặc có nên áp dụng ánh sáng hay không. Hoặc liệu đối tượng có nên được trộn alpha hay không. Hoặc một kết cấu (hoặc một danh sách các kết cấu) để sử dụng. Hoặc một vertex/fragment shader để sử dụng. Và như vậy, khả năng là vô tận. Bắt đầu bằng cách đặt những thứ bạn cần thành tài liệu. Trong đất OOP mà lớp học có thể được gọi (bất ngờ!) A Chất liệu.
Cảnh - bạn có phần hình học, bộ sưu tập tài liệu, thời gian để xác định nội dung trong cảnh. Trong một trường hợp đơn giản, mỗi đối tượng trong cảnh có thể được xác định bởi: - Hình học mà nó sử dụng (con trỏ tới Lưới), - Cách hiển thị nó (trỏ đến Material), - Vị trí của nó. Đây có thể là ma trận chuyển đổi 4x4 hoặc ma trận chuyển đổi 4x3 hoặc véc tơ (vị trí), quaternion (định hướng) và vec-tơ khác (tỷ lệ). Hãy gọi đây là số Nút trong vùng đất OOP.
Máy ảnh. Vâng, một máy ảnh không có gì hơn "nơi nó được đặt" (một lần nữa, một 4x4 hoặc ma trận 4x3, hoặc một vị trí và định hướng), cộng với một số thông số chiếu (lĩnh vực xem, tỷ lệ khía cạnh, ...).
Vì vậy, về cơ bản đó là nó! Bạn có một cảnh là một loạt các Nút tham chiếu đến các Lưới và Vật liệu, và bạn có một Máy ảnh xác định vị trí của người xem.
Hiện tại, nơi thực hiện cuộc gọi OpenGL thực tế chỉ là một câu hỏi thiết kế. Tôi muốn nói, không đặt các cuộc gọi OpenGL vào các lớp Node hoặc Mesh hoặc Material. Thay vào đó, hãy tạo một cái gì đó như OpenGLRenderer có thể duyệt qua cảnh và phát hành tất cả các cuộc gọi. Hoặc, thậm chí tốt hơn, làm cho một cái gì đó đi qua cảnh độc lập của OpenGL, và đưa các cuộc gọi cấp thấp hơn vào lớp phụ thuộc OpenGL.
Vì vậy, tất cả những điều trên là khá nhiều nền tảng độc lập. Đi theo cách này, bạn sẽ thấy rằng glRotate, glTranslate, gluLookAt và bạn bè khá vô dụng. Bạn đã có tất cả các ma trận rồi, chỉ cần chuyển chúng sang OpenGL. Đây là cách mà hầu hết mã thực tế thực tế trong các trò chơi/ứng dụng thực vẫn hoạt động.
Tất nhiên, điều trên có thể phức tạp do yêu cầu phức tạp hơn. Đặc biệt, vật liệu có thể khá phức tạp. Các mắt lưới thường cần hỗ trợ nhiều định dạng đỉnh khác nhau (ví dụ như các tiêu chuẩn đóng gói cho hiệu quả). Scene Nodes có thể cần phải được tổ chức trong một hệ thống phân cấp (điều này có thể được dễ dàng - chỉ cần thêm con trỏ/con trỏ đến nút). Lưới mắt và hình ảnh động nói chung thêm độ phức tạp. Và cứ thế.
Nhưng ý tưởng chính là đơn giản: có Hình học, có Vật liệu, có các đối tượng trong cảnh. Sau đó, một số đoạn mã nhỏ có thể hiển thị chúng.
Trong trường hợp OpenGL, việc thiết lập mắt lưới sẽ rất có khả năng tạo/kích hoạt/sửa đổi các đối tượng VBO. Trước khi bất kỳ nút nào được hiển thị, các ma trận sẽ cần được thiết lập. Và thiết lập Material sẽ chạm hầu hết trạng thái OpenGL còn lại (trộn, texturing, ánh sáng, combiners, shaders, ...).
Ý tưởng của bạn cho lớp lưới có vẻ hiển nhiên đối với tôi ngay bây giờ :) Những gì tôi đã cố gắng làm là sử dụng các đối tượng cho nguyên thủy như hình tam giác. Sử dụng các đối tượng để quản lý mắt lưới có ý nghĩa hơn nhiều, vì chúng có xu hướng khá tự đủ, đúng không? – fluffels
Ngoài ra, cảm ơn rất nhiều cho cái nhìn sâu sắc vào các công cụ độc lập nền tảng và làm cho cây! Điều đó giúp ích rất nhiều! – fluffels
Tôi nghĩ đây là một câu trả lời tuyệt vời! ... Bất cứ ai bắt đầu viết một động cơ 3d nên dựa trên những nguyên tắc này. (Hoặc thậm chí tốt hơn: sử dụng động cơ làm tất cả điều này cho bạn và tiết kiệm thời gian có giá trị) – fho