2011-06-28 30 views
7

Tôi hiện đang lập trình một trình tải .obj trong OpenGL. Tôi lưu trữ dữ liệu đỉnh trong một VBO, sau đó liên kết nó với Vertex Attribs. Tương tự cho các tiêu chuẩn. Điều là, dữ liệu bình thường và dữ liệu đỉnh không được lưu trữ theo cùng một thứ tự.Sử dụng một mảng khác nhau cho các đỉnh và tiêu chuẩn trong glDrawElements (OpenGL/VBOs)

Các chỉ mục mà tôi cung cấp cho glDrawElements để hiển thị lưới được sử dụng, tôi giả sử, bằng OpenGL để lấy đỉnh trong VBO đỉnh và lấy các chỉ số trong các chuẩn VBO.

Có cách nào hiệu quả hơn, ngoài việc sử dụng glBegin/glVertex/glNormal/glEnd để báo cho glDrawElements sử dụng chỉ mục cho các đỉnh và một chỉ mục khác cho các tiêu chuẩn? Cảm ơn

Trả lời

2

Bạn phải sử dụng cùng một chỉ mục cho vị trí/normals/texture coords ... Điều đó có nghĩa là khi tải .obj, bạn phải chèn các đỉnh độc đáo và trỏ khuôn mặt của bạn vào chúng.

7

Không có cách nào trực tiếp để thực hiện việc này, mặc dù bạn có thể mô phỏng nó bằng cách lập chỉ mục thành kết cấu bộ đệm (tính năng OpenGL 3.1) bên trong trình đổ bóng.

Thông thường, không nên làm điều đó. Định dạng OBJ cho phép một số tham chiếu bình thường (một số nguyên tắc) tại một thời điểm, do đó điều bình thường cần làm là xây dựng một đỉnh "hoàn chỉnh" bao gồm tọa độ và bình thường và texcoords cho mỗi đỉnh (nhân đôi dữ liệu tương ứng)).

này đảm bảo rằng
a) mịn bề mặt bóng mờ render chính xác
b) cạnh cứng render chính xác

(chênh lệch giữa hai là chỉ vài đỉnh chia sẻ cùng, giống bình thường)

+2

Lưu ý rằng khi tôi nói "không được khuyến khích", tôi thực sự muốn nói. Không chỉ logic phức tạp hơn việc xây dựng một dòng đỉnh thích hợp một lần và tải nó lên, mà còn có nghĩa là ngẫu nhiên trái ngược với truy cập dữ liệu tuần tự, nghĩa là bạn có một bộ nhớ cache được bảo đảm nhiều hơn hoặc ít hơn trên mọi đỉnh. – Damon

2

OpenGL xử lý một đỉnh như một vector dài duy nhất của

(position, normal, texcoord[0]…texcoord[n], attrib[0]…attrib[n]) 

và các vectơ dài này được lập chỉ mục. Câu hỏi của bạn rơi vào cùng một danh mục như cách sử dụng các đỉnh được chia sẻ với nhiều chuẩn. Và câu trả lời kinh điển là, rằng những đỉnh đó trong thực tế không được chia sẻ, bởi vì về lâu dài chúng không giống nhau.

Vì vậy, những gì bạn phải làm là lặp qua mảng chỉ mục của khuôn mặt và xây dựng các đỉnh "dài" thêm những thứ đó vào danh sách (mới) có ràng buộc duy nhất; bản đồ (băm) từ đỉnh → chỉ mục phục vụ công việc này. Một cái gì đó như thế này

next_uniq_index = 0 
for f in faces: 
    for i in f.indices: 
     vpos = vertices[i.vertex] 
     norm = normals[i.normal] 
     texc = texcoords[i.texcoord] 
     vert = tuple(vpos, norm, texc) 
     key 
     if uniq_vertices.has_key(key): 
      uniq_faces_indices.append(uniq_vertices[key].index) 
     else: 
      uniq_vertices[key] = {vertex = key, index = next_uniq_index} 
      next_uniq_index = next_uniq_index + 1 
Các vấn đề liên quan