2012-10-10 18 views
7

Hướng dẫn lập trình OpenGL ES thảo luận rằng bạn nên tránh dữ liệu đỉnh không thẳng hàng và đưa ra ví dụ về căn chỉnh dữ liệu với khối 4 byte.Sự liên kết quan trọng trong dữ liệu đỉnh opengl trong iOS

OpenGL ES Programming Guide

Misaligned vs Aligned vertex data

Tuy nhiên trong hầu hết các tài liệu giới thiệu và hướng dẫn Tôi đã tìm thấy trực tuyến Tôi không thấy bất cứ ai làm điều này. Ví dụ bên dưới là từ một dự án demo trên 71 Hình vuông:

static const SSTexturedVertexData3D EnemyFighterVertexData[] = { 
    {/*v:*/{1.987003, -0.692074, -1.720503}, /*n:*/{0.946379, -0.165685, -0.277261}, /*t:*/{0.972816, 0.024320}}, 

Và bạn vẫn làm như thế nào? Thêm một giả 0,0 đến v và n và 2 của chúng vào t? Tôi đoán là nếu bạn chỉ tải dữ liệu đỉnh một lần cho mỗi ứng dụng thì nó sẽ không quan trọng lắm nhưng nếu ràng buộc và khôi phục lại các mảng khác nhau trên mỗi khung được hiển thị thì nó sẽ là vấn đề quan trọng. Kế hoạch của tôi là kết hợp tất cả các mảng của tôi với nhau, nhưng tôi tò mò.

+2

Bạn có chắc chắn những điều trên chưa được căn chỉnh với ranh giới 4 byte không? Nếu mã bạn hiển thị đang sử dụng GLfloats, đó là các loại dữ liệu 32 bit (4 byte), do đó, bất kể có bao nhiêu trong số chúng, chúng luôn được căn chỉnh với một ranh giới 4 byte. Hướng dẫn này đề cập đến quần short và các loại dữ liệu khác. –

+0

Tôi đã tự hỏi điều đó. Cảm ơn! Bạn nên đặt câu trả lời đó để tôi có thể đánh dấu nó. – badweasel

+1

Tôi có thể, nhưng nó không trả lời câu hỏi cơ bản hơn về cách liên kết byte quan trọng của dữ liệu đỉnh là hiệu suất. Điều đó có thể yêu cầu một số điểm chuẩn để minh họa đầy đủ. –

Trả lời

2

Chung một đỉnh được tạo thành từ floats sẽ được căn chỉnh, vì vậy bạn không cần quá lo lắng về điều đó. Thực tế, rất nhiều cuốn sách sử dụng các số liệu bình thường struct s để giữ dữ liệu đỉnh, không được đảm bảo tiếp giáp do vấn đề đệm, nhưng nếu tất cả các bạn có phao, điều đó tốt vì bạn không có khả năng đệm. Tất nhiên, một số người (bao gồm tôi) thích sử dụng STL vector từ C++ nhưng nếu bạn đang sử dụng iOS, trong khi bạn có thể sử dụng C++, bạn có thể sử dụng Objective-C như vậy, tiếp giáp theo cách không cấu trúc sẽ liên quan đến mảng C bình thường không vui khi làm việc cùng.

Nếu bạn tạo cấu trúc tùy chỉnh để giữ dữ liệu đỉnh cũng như dữ liệu khác cho đối tượng có thể kéo và bạn sử dụng short s hoặc các loại khác, bạn có thể thấy phần đệm để trở thành vấn đề. Nhưng nếu bạn chỉ gắn bó với float thì bạn sẽ ổn thôi và bạn sẽ ở trong công ty tốt vì hầu hết các nguồn giáo dục trên OpenGL đều làm điều này.

+0

Tôi là iOS nhưng tôi tránh sử dụng các cấu trúc c mục tiêu cho bất kỳ thứ gì. Tôi thường sử dụng "static const GLfloat Vertex []" và sau đó tải nó vào một VBO. Thật kỳ lạ, đối với các hình ảnh 2D, tôi thực sự sử dụng một tài liệu excel được tùy chỉnh để tạo tất cả dữ liệu đỉnh của tôi. Đối với 3d tôi nhập tệp obj và lưu nó dưới dạng tệp nhị phân để tải nhanh trong trò chơi. Tôi sẵn sàng cung cấp cho bạn dấu kiểm chỉ dành cho nỗ lực này. Điểm của Brad Larson mặc dù trong bình luận về câu hỏi của tôi là nó không thể trả lời mà không cần kiểm tra. Có thể là một điểm hợp lệ. – badweasel

+0

Một lưu ý khác .. Tôi ghét điều này về stackoverflow, nơi bạn muốn trả lời một câu hỏi và bạn tìm kiếm .. sau đó craft câu trả lời của bạn chỉ để nhận ra câu hỏi là một hoặc hai năm cũ. Vì vậy, rõ ràng câu trả lời tôi đã sử dụng là của Brad rằng tôi đã ở trong ranh giới 4 byte ... một năm trước đây. :) – badweasel

+0

@badweasel Trong sự tò mò, bạn đang sử dụng kỹ thuật nào trong iOS để nhập khẩu obj và sau đó tuần tự hóa thành nhị phân? Bạn có tận dụng GLKit hoặc một thư viện khác để chuyển đổi hay bạn tự chuyển đổi dữ liệu văn bản OBJ? Và sau đó bạn đang tạo phương thức nhị phân với phương thức nào? –