あなたがする必要があるのは と呼ばれ3d transformations
ます。
通常、OpenGL または Direct3D で行う方法は、メッシュの頂点に変換行列を掛けることです。
ほとんどの場合、メッシュはモデリング プログラムからエクスポートされ、オブジェクト スペースにあります。これらのメッシュをワールドの周りに配置するには、それらをワールド マトリックスで乗算してワールド空間に取り込む必要があります。このワールド マトリックスは、平行移動、回転、スケーリングをすべて 1 つのマトリックスに制限できます。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、ニア/ファー プレーンなどの投影設定から計算される、ビューと投影のマトリックスを組み合わせたものです。