2011-07-28 43 views
8

Tôi không thể tìm ra cách sử dụng đối tượng bộ đệm đỉnh cho địa hình của tôi trong phiên bản 2.0 dành cho iphone. Đó là dữ liệu tĩnh vì vậy tôi hy vọng cho một tăng tốc độ bằng cách sử dụng VBO. Trong OpenGL thông thường, tôi sử dụng danh sách hiển thị cùng với trình đổ bóng không có vấn đề gì. Tuy nhiên, trong phiên bản 2.0, tôi phải gửi dữ liệu đỉnh tới shader như một thuộc tính và không biết cách làm việc này với VBO. Làm thế nào để bộ đệm đỉnh có thể biết thuộc tính nào mà nó có để liên kết dữ liệu đỉnh với khi được gọi? Điều này thậm chí có thể trong es 2.0 opengl? Nếu không, có cách nào khác để tôi có thể tối ưu hóa kết xuất địa hình tĩnh không?OpenGL ES 2.0 và các đối tượng đệm đỉnh (VBO)

Trả lời

12

Chắc chắn, điều này là khá đơn giản trên thực tế, thuộc tính của bạn có một vị trí, và dữ liệu đỉnh được nuôi dưỡng bằng glVertexAttribPointer cho đồng bằng Vertex Mảng, như thế này:

float *vertices = ...; 
int loc = glGetAttribLocation(program, "position"); 
glVertexAttribPointer(loc, 3, GL_FLOAT, GL_FALSE, 0, vertices); 

Đối VBOs, đó là giống nhau, nhưng bạn có để liên kết bộ đệm với mục tiêu GL_ARRAY_BUFFER, và tham số cuối cùng của glVertexAttribPointer bây giờ là một bù đắp vào bộ nhớ đệm lưu trữ. Giá trị con trỏ chính nó được hiểu là một bù đắp:

glBindBuffer(GL_ARRAY_BUFFER, buffer); 
int loc = glGetAttribLocation(program, "position"); 
glVertexAttribPointer(loc, 3, GL_FLOAT, GL_FALSE, 0, 0); 

Trong trường hợp này bù đắp là 0, giả sử dữ liệu đỉnh được tải lên khi bắt đầu bộ đệm. Phần bù là các số đo theo byte.

Bản vẽ sau đó được thực hiện với glDrawArrays/glDrawElements. Hi vọng điêu nay co ich!

+0

Có điều này nên làm những gì tôi cần. Tôi sẽ thử nó vào ngày mai. Cảm ơn! – Nitrex88

+0

Nó có lẽ sẽ giúp tôi nếu tôi có thể tìm thấy những gì phải làm với 'đỉnh' trong ví dụ thứ hai. Một ý tưởng? –

+1

@Stephane đỉnh nên được tải lên một VBO bằng cách sử dụng glBufferData. –

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