你需要做的就是调用3d transformations
。
它在 OpenGL 或 Direct3D 中完成的方式通常是将网格的顶点与变换矩阵相乘。
网格大部分时间是从建模程序中导出的,并且它们位于对象空间中。要将这些网格放置在您的世界中,您需要通过将它们与世界矩阵相乘来将它们带入世界空间。这个世界矩阵可以在一个矩阵中包含平移、旋转和缩放。DirecXMath 库为您提供了轻松创建这些矩阵的方法,并且还有用于 OpenGL 的免费库。
创建世界矩阵后,将其传递给顶点着色器,并将每个传入的顶点与矩阵相乘,以获得世界空间中的顶点。
一个基本的顶点着色器在 HLSL 中看起来像这样:
cbuffer cbPerObject : register(b0)
{
float4x4 world;
float4x4 viewProj;
};
struct VS_INPUT
{
float3 position:SV_POSITION;
};
struct VS_OUTPUT
{
float4 position:SV_POSITION;
};
VS_OUTPUT main( VS_INPUT vsin )
{
VS_OUTPUT output;
float3 position = mul( float4(vsin.position,1.0), world).xyz;
output.position = mul(float4(position,1.0), viewProj);
return output;
}
因此,如果您为每个网格实例提供不同的世界矩阵,它们都可以放置在不同的位置并具有不同的比例和旋转。
这viewProj
是视图和投影矩阵的组合,它是根据您的相机和投影设置(如视图方向、位置/旋转、FOV、近/远平面等)计算得出的。