2011-08-28 31 views
7

Có thể lưu trữ các thuộc tính đỉnh khác nhau trong các bộ đệm đỉnh khác nhau không?Lưu trữ các thuộc tính đỉnh khác nhau trong các khác nhau của VBO

Tất cả các ví dụ tôi đã nhìn thấy cho đến nay làm một cái gì đó như thế này

float data[] = 
{ 
//position 
    v1x, v1y, v1z, 
    v2x, v2y, v2z, 
    ... 
    vnx, vny, vnz, 

//color 
    c1r, c1g, c1b, 
    c2r, c2g, c2b, 
    ... 
    cnr, cng, cnb, 
}; 
GLuint buffname; 
glGenBuffers(1, &buffname); 
glBindBuffer(GL_ARRAY_BUFFER, buffname); 
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW); 

Và các bản vẽ được thực hiện một cái gì đó như thế này:

glBindBuffer(GL_ARRAY_BUFFER, buffname); 
glEnableVertexAttrib(position_location); 
glEnableVertexAttrib(color_location); 
glVertexAttribPointer(position_location, 3, GL_FLOAT, GL_FALSE, 0, 0); 
glVertexAttribPointer(color_location, 3, GL_FLOAT, GL_FALSE, 0, (void*)(3*n)); 

glDrawArrays(GL_TRIANGLES, 0, n/3); 

glDisableVertexAttrib(position_location); 
glDisableVertexAttrib(color_location); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

Không phải là nó có thể lưu trữ dữ liệu vị trí và dữ liệu màu trong các VBO khác nhau? Vấn đề là tôi không hiểu làm thế nào điều này sẽ làm việc ra bởi vì bạn không thể ràng buộc hai bộ đệm cùng một lúc, có thể bạn?

Nếu có một giải pháp đơn giản nhưng không hiệu quả, tôi sẽ thích nó hơn một giải pháp phức tạp hơn nhưng hiệu quả vì tôi đang ở trạng thái học chính và tôi không muốn làm phức tạp quá nhiều.

Ngoài ra, nếu những gì tôi yêu cầu là có thể, đó có phải là một ý tưởng hay không?

Để làm rõ: Tôi hiểu cách tôi có thể lưu trữ các thuộc tính khác nhau trong các VBO khác nhau. Tôi không hiểu làm thế nào sau này tôi sẽ vẽ chúng.

Trả lời

9

Mối liên hệ giữa vị trí thuộc tính X và đối tượng bộ đệm cung cấp thuộc tính đó được thực hiện với lệnh glVertexAttribPointer. Cách nó hoạt động đơn giản nhưng không trực quan.

Đồng thời glVertexAttribPointer được gọi (đó là phần rất nhiều người không nhận được), bất kể đệm đối tượng hiện đang bị ràng buộc để GL_ARRAY_BUFFER trở nên gắn liền với thuộc tính X, trong đó X là tham số đầu tiên của glVertexAttribPointer.

Vì vậy, nếu bạn muốn có một thuộc tính mà xuất phát từ một bộ đệm và một thuộc tính mà đến từ khác, bạn làm như sau:

glEnableVertexAttrib(position_location); 
glEnableVertexAttrib(color_location); 
glBindBuffer(GL_ARRAY_BUFFER, buffPosition); 
glVertexAttribPointer(position_location, 3, GL_FLOAT, GL_FALSE, 0, 0); 
glBindBuffer(GL_ARRAY_BUFFER, buffColor); 
glVertexAttribPointer(color_location, 3, GL_FLOAT, GL_FALSE, 0, 0); 

Đối với việc bạn nên chia các thuộc tính vào bộ đệm khác nhau. .. Tôi sẽ nói rằng bạn chỉ nên làm điều đó nếu bạn có có thể chứng minh được cần.

Ví dụ: giả sử bạn đang tạo bản đồ độ cao động, có lẽ đối với một số loại hiệu ứng nước. Vị trí Z của mỗi phần tử thay đổi, nhưng điều này cũng có nghĩa là các chỉ tiêu thay đổi. Tuy nhiên, các vị trí XY và tọa độ kết cấu không thay đổi.

Phát trực tuyến hiệu quả thường yêu cầu đệm hai đối tượng đệm hoặc làm mất hiệu lực chúng (phân bổ lại chúng bằng glBufferData (NULL) hoặc glMapBufferRange (GL_INVALIDATE_BIT)). Dù bằng cách nào cũng chỉ hoạt động nếu dữ liệu được truyền trong một đối tượng đệm khác từ dữ liệu không được truyền trực tiếp.

Một ví dụ khác về nhu cầu có thể chứng minh là nếu bộ nhớ là mối quan tâm và một số đối tượng chia sẻ danh sách thuộc tính nhất định. Có lẽ các đối tượng có vị trí khác nhau và các mảng bình thường nhưng các mảng phối hợp màu sắc và kết cấu giống nhau. Hay đại loại thế.

Nhưng nếu không, tốt nhất là chỉ cần đặt mọi thứ cho một đối tượng vào một bộ đệm. Ngay cả khi bạn không xen kẽ các mảng.

+1

Cảm ơn bạn rất nhiều! Tôi hiểu!Nhiều thứ khác trở nên đột nhiên rõ ràng hơn :))) Còn câu hỏi thứ hai của tôi thì sao? Nó thường được coi là một ý tưởng hay không? –

+1

@Armen: xem chỉnh sửa của tôi. –

+0

Tôi thấy rõ hơn bây giờ. Cảm ơn rất nhiều. Vì vậy, nó đơn giản trường hợp chúng ta nên sử dụng cách tiếp cận đầu tiên được đề cập bởi Nicol, và IF cần chúng tôi sử dụng các VBO khác nhau. Cảm ơn rõ ràng hơn nhiều! –

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