我试图为 Mesh 类进行通用编程。(我需要 CPU 转换来变形网格,这就是为什么这不是在 GPU 中完成的,以防你想问)
AMesh<T>
包含 3d 形状的顶点,以及面连接(哪些顶点连接在一起形成三角形)。
这里T
是顶点的类型,一些类型的模型有 PNCT 类型(位置、法线、颜色、texcoord)而其他的只是 PC(位置、颜色)。
struct VertexPNCT {
Vector3 pos, normal ;
Vector4 color ;
Vector2 tex ;
} ;
struct VertexPC {
Vector3 pos ;
Vector4 color ;
} ;
当然,所有顶点都有一个位置!
但这是我的问题。
Mesh<T>
必须实现一个transform
方法。当然,每个顶点格式都有一个位置,如果它的命名一致(.pos
),那么该方法可以正常工作:
.pos
由于每个顶点肯定都有一个位置,如果我总是在结构中调用该成员,那么我可以向模板类Vertex*
添加一个方法:.transform
Mesh<T>
void transform( Matrix4& mat )
{
each vertex
vertex.pos = mat * vertex.pos ; // transform it
}
现在这是搞砸了。 如果顶点格式中有法线,那么法线也必须进行转换(通过“法线矩阵”)。现在我的模板中有一个“if 语句”?我必须.transform
为每种顶点类型编写一个模板特化方法(基本上分为两类,有法线的和没有法线的)?
我在这里滥用了模板吗?错过了一些“编程船”?
这是我真正想做的合乎逻辑的事情:
void transform( Matrix4& mat )
{
each vertex in vertices
{
vertex.pos = mat * vertex.pos ; // transform it
#ifdef vertex.normal
vertex.normal = mat * vertex.normal ; // transform normal as well*
#endif
}
}
* 假设转换没有尺度(那么你不需要使用“正常矩阵”)