的OpenGL將頂點看作單個長向量
(position, normal, texcoord[0]…texcoord[n], attrib[0]…attrib[n])
並且這些長向量被索引。您的問題屬於同一類別,例如如何使用具有多個法線的共享頂點。規範的答案是,那些頂點事實上並不共享,因爲從長遠來看,它們並不相同。
所以你需要做的是遍歷面的索引數組,並構造「長」頂點將這些添加到具有uniquenes約束的(新)列表中;來自頂點→索引的(散列)圖服務於此作業。像這樣的東西
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
請注意,當我說「不可取」時,我的確是這個意思。這不僅比構造適當的頂點流並上傳它更復雜,而且它意味着隨機而不是順序數據訪問,也就是說,每個頂點都有或多或少的保證緩存未命中。 – Damon