Làm thế nào là hình ảnh động được xử lý trong OpenGL không ngay lập tức?


8

Tôi là người mới chơi OpenGL hiện đại. Tôi cảm thấy thoải mái với phương pháp OpenGL ngay lập tức, nhưng tôi chưa bao giờ thực hiện bất kỳ việc sử dụng VBO nghiêm trọng nào. Câu hỏi của tôi là về hoạt hình. Trong chế độ ngay lập tức, để đạt được hiệu ứng động, bạn chỉ cần truyền các vị trí đỉnh khác nhau (được nội suy từ khung hình chính) trong không gian đối tượng.

Làm thế nào điều này đạt được trong OpenGL không ngay lập tức? Rõ ràng, tải lên dữ liệu VBO mới cho mỗi khung hình chắc chắn sẽ làm hỏng xe buýt đồ họa. Tôi chưa tìm thấy tài liệu nào về cách hiện đại để làm điều đó. Suy nghĩ về nó, tôi đã đi đến một số lựa chọn:

  • Các thuộc tính: hình ảnh động như một phần bù 3d. Đối với mỗi khung, một thuộc tính bù khác nhau (có thể được nội suy) được truyền cho mỗi đỉnh, được áp dụng cho cùng một đỉnh mỗi khung hình chính.
  • Chỉ số: lưu trữ các khung hình chính dưới dạng các đỉnh tuyệt đối và tích lũy chúng thông qua lập chỉ mục, sử dụng một tập hợp các đỉnh khác nhau cho mỗi khung hình chính. Tôi thấy cách tiếp cận này là không thể, vì bạn không thể truy cập các khung hình chính liền kề và do đó không thể nội suy giữa chúng. Ngoài ra, có vẻ như một ý tưởng tồi cho hoạt hình thủ tục.
  • Kết cấu: điều này có thể rất co giãn nhưng nghe có vẻ là một giải pháp tốt cho tôi. Một lần nữa, hình ảnh động được coi là phần bù xyz cho mỗi đỉnh. Mỗi khung hình chính có thể được lưu trữ trong kết cấu 1D trong đó kích thước ánh xạ tới vertexID. Nếu tôi không nhầm, trong OpenGL 4.0, bạn có thể truy cập kết cấu từ bất kỳ trình đổ bóng nào, vì vậy bạn có thể đọc kết cấu này từ trình tạo bóng đỉnh và áp dụng từng phép biến đổi đỉnh. Một kết cấu 2D có thể chứa nhiều khung hình. Bạn vẫn thực hiện phép nội suy (và nếu phép nội suy hoạt động cho kết cấu bên ngoài shader mảnh, mà tôi không chắc chắn, bạn có thể nội suy tuyến tính miễn phí!) Điều này có thể được áp dụng cho các hệ thống hoạt hình phức tạp hơn như hoạt hình xương mà không cần nhiều nỗ lực.

Tôi có lật đổ điều này không? Bất cứ ai có thể làm sáng tỏ?

Câu trả lời:


5

Tôi chưa tìm thấy tài liệu nào về cách hiện đại để làm điều đó.

Nói chung là vì "cách hiện đại" để có hoạt hình nhân vật là sử dụng trọng lượng xương, chứ không phải trộn đỉnh.

Tuy nhiên, nếu bạn khăng khăng thực hiện hoạt hình dựa trên pha trộn đỉnh, bạn có thể. Cách đơn giản nhất là chỉ cần gửi hai khung hình chính bạn muốn trộn giữa làm thuộc tính. Bạn có dữ liệu vị trí cho tất cả các khung hình chính khác nhau; chỉ sử dụng glVertexAttribPointer(hoặc glVertexPointernếu bạn nhấn mạnh) để chọn các khung hình chính cụ thể. Vì mỗi khung hình chính phải có dữ liệu vị trí được lưu trữ theo cùng một thứ tự (đối với các vị trí tương ứng), chúng có thể sử dụng cùng một danh sách chỉ mục để hiển thị.

Trình đổ bóng nhận được hai thuộc tính "vị trí", một cho khung hình chính trước thời điểm hiện tại và một cho khung hình chính sau. Bạn cũng sẽ vượt qua một bộ đồng phục chỉ định mức độ pha trộn giữa chúng. Bạn tính toán vị trí mới dưới dạng pha trộn giữa hai khung hình chính và sau đó thực hiện các phép biến đổi thông thường từ đó.


Bạn có bất kỳ cuốn sách hoặc bài báo được đề nghị để đọc để bắt đầu tìm hiểu về cách viết mã để xử lý trọng lượng xương?
michael.bartnett

Tôi đang tìm kiếm "làm thế nào để di chuyển các đỉnh" chứ không phải làm thế nào để làm hoạt hình thực tế. Chà, nó không quá khác biệt với trọng lượng xương xương, sau tất cả, nó đi xuống các đỉnh di chuyển xung quanh, khi nó được tính toán trước (pha trộn đỉnh) hoặc trọng lượng xương khi đang bay. Là thuộc tính cách duy nhất để đi vẫn còn? Không phải cách tiếp cận dựa trên kết cấu vẫn khả thi và nhanh hơn so với việc truyền nhiều dữ liệu cho mỗi đỉnh mỗi khung hình? (ít nhất là cả hai khung hình chính trên xương và hệ số pha trộn) Một kết cấu vẫn có thể mã hóa xoay vòng xương và việc tra cứu kết cấu nhanh hơn nhiều so với chuyển qua các thuộc tính.
kaoD

Ngoài ra: "Vì mỗi khung hình chính nên lưu trữ dữ liệu vị trí của nó [...] nên họ có thể sử dụng cùng một danh sách chỉ mục để kết xuất." Điều đó là không thể? Làm thế nào tôi có thể truy cập hai chỉ số để nội suy giữa? Không phải các shader đỉnh không biết đến các đỉnh khác, và thậm chí nhiều hơn với các chỉ số khác?
kaoD

@kaoD: Không thể? Không phải đó là những gì bạn làm hiện tại để tính toán vị trí đỉnh mới sao? Đối với mỗi vị trí trong mỗi mảng khung hình chính, bạn trộn chúng lại với nhau và viết chúng vào OpenGL. Tất cả những gì tôi nói là bạn cung cấp các mảng khung hình chính đó cho OpenGL và để trình đổ bóng thực hiện pha trộn. Đối với tra cứu kết cấu, trong hệ thống phân cấp của "những thứ nhanh trong shader", nhìn chung về kết cấu thường ở phía dưới . Các thuộc tính là, ít nhiều miễn phí .
Nicol Bolas

@NicolBolas: thật tốt khi biết rằng việc tra cứu kết cấu chậm hơn tôi nghĩ. Điều tôi muốn nói là không thể là, nếu tôi không nhầm, mỗi đỉnh chỉ có thể 'nhìn thấy' trong trình đổ bóng, và do đó không thể lập chỉ mục các đỉnh khác hoặc truy cập bất kỳ mảng nào khác (khung hình chính.) Tôi hiểu gì từ câu trả lời của bạn là tôi phải vượt qua hai vị trí khung hình chính này dưới dạng attribs cho mỗi đỉnh, cùng với đồng phục hệ số pha trộn, nhưng sau đó tôi sẽ không có mảng đỉnh, phải không? Mặc dù tôi mới nhận ra rằng bạn có thể sử dụng keyframe hiện tại làm mảng đỉnh và khung tiếp theo làm mảng thuộc tính, đây có phải là ý bạn không?
kaoD
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.