2012-01-28 37 views
9

Có thể trong GLSL trên máy tính để bàn chuyển một mảng kích thước cố định của phao nổi đến trình đổ bóng đỉnh như một thuộc tính không? Nếu có, làm thế nào?GLSL cho mỗi mảng kích thước cố định đỉnh

Tôi muốn có mỗi trọng lượng đỉnh cho nhân vật hoạt hình vì vậy tôi muốn có một cái gì đó như sau trong vertex shader của tôi:

attribute float weights[25]; 

Làm thế nào tôi sẽ lấp đầy các mảng thuộc tính từ C của tôi ++ chương trình & OpenGL? Tôi đã thấy trong một question khác mà tôi có thể nhận được vị trí thuộc tính của thuộc tính mảng và sau đó chỉ cần thêm chỉ mục vào vị trí đó. Ai đó có thể đưa ra một ví dụ về điều đó cho mảng khá lớn của tôi?

Cảm ơn.

Trả lời

16

Hãy bắt đầu với những gì bạn yêu cầu.

Trên phần lớn không có phần cứng nào tồn tại hiện tại sẽ attribute float weights[25]; biên dịch. Mặc dù trình đổ bóng có thể có các mảng thuộc tính, mỗi chỉ mục mảng đại diện cho chỉ số thuộc tính mới mới. Và trên tất cả phần cứng hiện đang tồn tại, số chỉ mục thuộc tính tối đa là ... 16. Bạn cần 25 và đó là chỉ cho các trọng số.

Bây giờ, bạn có thể giảm thiểu điều này một cách dễ dàng bằng cách nhớ rằng bạn có thể sử dụng các thuộc tính vec4. Vì vậy, bạn lưu trữ mỗi bốn phần tử mảng trong một thuộc tính duy nhất. Mảng của bạn sẽ là attribute vec4 weights[7]; có thể thực hiện được. Logic tải trọng của bạn sẽ phải thay đổi tất nhiên.

Mặc dù vậy, bạn dường như không tham gia vào các chi tiết về điều này thực tế là có nghĩa là cho dữ liệu đỉnh của bạn. Mỗi thuộc tính đại diện cho một thành phần của dữ liệu của một đỉnh. Mỗi đỉnh cho một cuộc gọi rendering sẽ có cùng một lượng dữ liệu; nội dung của dữ liệu đó sẽ khác nhau, nhưng không bao nhiêu dữ liệu.

Để thực hiện những gì bạn đang đề xuất, mỗi đỉnh trong lưới của bạn sẽ cần 25 float mô tả trọng lượng. Ngay cả khi điều này được lưu trữ dưới dạng byte chưa được chuẩn hóa, vẫn còn tối thiểu 25 byte giá trị dữ liệu ở mức tối thiểu. Đó là rất nhiều. Đặc biệt là xem xét cho lớn nhất phần lớn các đỉnh, hầu hết các giá trị này sẽ là 0. Ngay cả trong trường hợp xấu nhất, bạn sẽ xem xét có lẽ 6-7 xương ảnh hưởng đến một đỉnh duy nhất.

Cách xử lý thường được thực hiện trong các trình đổ bóng đỉnh là giới hạn số lượng xương ảnh hưởng đến một đỉnh đơn đến bốn. Bằng cách này, bạn không sử dụng một mảng các thuộc tính; bạn chỉ cần sử dụng thuộc tính vec4 cho trọng số. Tất nhiên, bây giờ bạn cũng cần phải nói xương nào được kết hợp với trọng lượng nào. Vì vậy, bạn có thuộc tính thứ hai vec4 chỉ định chỉ mục xương cho trọng lượng đó.

Điều này tạo ra sự cân bằng tốt. Bạn chỉ chiếm 2 thuộc tính phụ (có thể là các byte chưa ký theo kích thước). Và đối với phần lớn các đỉnh, bạn sẽ không bao giờ nhận thấy, bởi vì hầu hết các đỉnh chỉ bị ảnh hưởng bởi 1-3 xương. Một số ít sử dụng 4, và ít sử dụng hơn 5+. Trong những trường hợp đó, bạn chỉ cần cắt giảm các trọng số thấp nhất và tính lại trọng số của những người khác một cách tương xứng.

+2

Cảm ơn bạn rất nhiều. Bạn đã trả lời tất cả các câu hỏi của tôi và thậm chí nhiều hơn nữa! Tôi hy vọng điều này sẽ cải thiện đáng kể hiệu suất! Cảm ơn một lần nữa. – Nicholas

11

Nicol Bolas đã cung cấp cho bạn câu trả lời cách cơ cấu lại nhiệm vụ của bạn. Bạn nên làm điều đó, bởi vì xử lý 25 phao cho một đỉnh, có lẽ thông qua một số phép nhân bậc bốn sẽ lãng phí rất nhiều sức mạnh xử lý GPU tốt; hầu hết các thuộc tính cho một đỉnh sẽ dịch gần với chuyển đổi nhận dạng.

Tuy nhiên vì lý do học thuật tôi sẽ cho bạn biết, cách vượt qua 25 phao nổi trên mỗi đỉnh. Điều quan trọng là không sử dụng các thuộc tính cho điều này, nhưng lấy dữ liệu từ một số bộ đệm, một kết cấu. Giai đoạn đổ bóng đỉnh GLSL có biến được xây dựng gl_VertexID, chuyển giá trị của đỉnh hiện đang xử lý. Với OpenGL gần đây, bạn cũng có thể truy cập các kết cấu từ trình đổ bóng đỉnh. Vì vậy, bạn có một kết cấu kích thước vertex_count × 25 giữ các giá trị. Trong vertex shader của bạn, bạn có thể truy cập chúng bằng cách sử dụng texelFetch chức năng, ví dụ: texelFetch(param_buffer, vec2(gl_VertexID, 3));

Nếu được sử dụng trong phim hoạt hình xương hệ thống này thường được gọi là texture lột da. Tuy nhiên nó nên được sử dụng một cách tiết kiệm, vì nó là một con heo thực sự thực sự. Nhưng đôi khi bạn không thể tránh nó, ví dụ khi thực hiện một hệ thống hoạt hình khuôn mặt, nơi bạn phải cân tất cả các đỉnh đến 26 cơ, nếu bạn muốn mô phỏng chính xác khuôn mặt người.

+0

Rất thú vị! Tôi sẽ ghi nhớ điều đó cho công việc trong tương lai. – Nicholas

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