网格(Mesh)
网格处理核心概念
1. 网格数据结构优化
顶点压缩技术:
// 使用16位浮点数减少内存占用
struct CompressedVertex {
glm::vec<3, float16_t> position;
glm::vec<3, int16_t> normal; // 使用球面坐标压缩
glm::vec<2, uint16_t> texCoords; // 0-1范围映射到0-65535
};
// 转换函数
CompressedVertex compressVertex(const Vertex& v) {
CompressedVertex cv;
cv.position = glm::vec<3, float16_t>(v.Position);
// 法线压缩(八面体映射)
glm::vec2 octNormal = glm::packSnorm2x16(glm::vec2(
glm::atan(v.Normal.x, v.Normal.z) / glm::pi<float>(),
v.Normal.y * 0.5f + 0.5f
));
cv.normal = glm::vec<2, int16_t>(octNormal);
// 纹理坐标压缩
cv.texCoords = glm::vec<2, uint16_t>(
v.TexCoords.x * 65535.0f,
v.TexCoords.y * 65535.0f
);
return cv;
}
2. 索引缓冲优化
索引重用技术:
// 使用网格优化库(meshoptimizer)
#include <meshoptimizer.h>
void optimizeMesh(std::vector<Vertex>& vertices, std::vector<unsigned int>& indices) {
// 顶点缓存优化
meshopt_optimizeVertexCache(&indices[0], &indices[0], indices.size(), vertices.size());
// 顶点获取优化
meshopt_optimizeVertexFetch(
vertices.data()