2011-09-08 28 views
5

OpenGL người mới câu hỏi: nếu tôi làm điều gì đó như thế này:OpenGL: yêu cầu tuổi thọ của mảng đỉnh

GLfloat vertices[] = { .... }; 
glVertexPointer(3, GL_FLOAT, 0, vertices); 
... set other stuff ... 
glDrawArrays(...); 

tuổi thọ yêu cầu của mảng 'đỉnh' là gì? (Hay nói cách khác, OpenGL sẽ lấy một bản sao của phần có liên quan và tại điểm nào?) Ví dụ, nó có được chấp nhận cho các mảng nằm trên stack như nó ngầm định, hoặc là nó cần thiết để tồn tại sau khi glDrawArrays () được gọi là?

[Đối với những gì nó có giá trị, tôi lập trình đặc biệt dành cho iOS, và vào lúc này làm việc với mã bên trong phương pháp drawFrame tạo ra trong một dự án OpenGL như thiết lập mặc định trong XCode.]

Trả lời

2

mảng của bạn phải sống cho đến khi glDrawArrays, nó có thể bị phá hủy sau đó và như ngụ ý bởi điều này, nó có thể nằm trên stack.

1

Nội dung của mảng đỉnh sẽ được sao chép mỗi khi bạn gọi glDrawArrays/Elements và do đó vẫn phải tồn tại tại thời điểm này (cho đến khi bạn không gọi glDrawArrays/Elements nữa hoặc thay đổi mảng đỉnh bằng cuộc gọi đến gl...Pointer).

Để lưu dữ liệu đỉnh (và dữ liệu khác) trên GPU và để trình điều khiển quản lý bộ nhớ (cùng với cải tiến hiệu suất không cần truyền dữ liệu ở mỗi cuộc gọi vẽ), bạn có thể sử dụng vertex buffer objects. Một khi bạn sao chép dữ liệu của bạn vào một VBO như vậy nó nằm trong bộ nhớ GPU (hoặc nơi người lái nghĩ rằng nó phù hợp nhất) và bạn thực sự không cần bản sao CPU của bạn nữa. Nhưng đây là những tuyên bố đơn giản, tham khảo tài liệu về VBO để biết thêm thông tin.

+0

Hmm OK sẽ xem xét các đối tượng đệm tại một số điểm. Là ứng dụng OpenGL đầu tiên của tôi, tôi đang tìm kiếm một số lượng nhỏ nguyên thủy trên màn hình cho ứng dụng xếp hình thay vì bất cứ thứ gì quá chảy máu ở giai đoạn này, nhưng chắc chắn sẽ xem xét khi tôi làm điều gì đó phức tạp hơn. –

+0

@Neil Có nghĩa là một lưu ý nhỏ hơn, dù sao đi nữa. Nó luôn luôn là tốt để tìm hiểu từng bước. –

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