DirectX 3 Dゲーム開発七backface culling(背面消去)
5266 ワード
EasyLiuのブログへようこそ!
参照先:http://www.cnblogs.com/graphics/archive/2010/11/21/1883139.html DirectX.9.0.3 Dゲーム開発プログラミング基礎
まずbackfaceとは何かを見てみましょう.backfaceがあれば必ずfrontfaceがあります.DXではfrontfaceはこのように定義されています.頂点定義の前後順に時計回りに並ぶ頂点からなる三角形はfrontface(view spaceを参照)、frontfaceと対向する面はbackfaceです.下図のように.
frontfaceを決定する要因は2つあることがわかります
頂点定義の前後順序頂点の配列方向-時計回りまたは反時計回り(頂点の位置座標によって決まる).
まず1つ目を見て、頂点の位置が変わらないが、定義の順序が変わった場合、frontfaceがbackfaceになる可能性があります.以下の図です.
2つ目を見ると、頂点の定義順序が変わらないが、位置が変わった場合、frontfaceがbackfaceになる可能性もあります.以下の図です.
通常、backfaceは表示されません.レンダリング速度を向上させるために、DXはユーザーがbackfaceを除去できるようにするには、3つの除去方法があります.
D3DCULL_NONE-を削除しない
D3DCULL_CW-時計回りに削除D3DCULL_CCW-反時計回りに削除(これはDXのデフォルトの削除方法).
このコードは、次のコードは6つの頂点を定義し、2つの三角形を描くことができます.さまざまな除去方法がどのように動作しているかを見てみましょう.頂点数が少ないため、ここではIndexBufferを使用せず、そのままVertexBufferで操作しており、便宜上、D 3 DFVF_を採用しているXYZRHW | D3DFVF_DIFFUSE形式の頂点、TransformとLighting操作を省く
除去方式1-D 3 DCULL_NONE
何も除去しないので、2つの三角形が表示されます.
除去方式2-D 3 DCULL_CW
時計回りに削除、v 0、v 1、v 2は時計回りに配列されているため、最初の三角形は削除され、2番目だけが表示されます.
除去方式3-D 3 DCULL_CCW
反時計回りに削除、v 3、v 4、v 5は反時計回りに配列されているため、2番目の三角形は削除され、1番目の三角形のみが表示されます.
削除方法を指定しないで、結果はD 3 DCULL_と同じです.CCW、D 3 DCULL_CCWはデフォルトの消去方式です.
練習して
D 3 Dのデフォルトの消去方法(反時計回りの消去)に従って、正しい頂点の順序はどのようなものですか?vertex bufferを使用するとします.
各面の三角形を定義する際には、必ずこの面に向かっている、すなわち、この面法ベクトルの相対的な方向でこの面を観察し、三角形の頂点の順序を定義することが立方体で特に重要であることに注意してください.正しい順番は以下の通りです.
さらに進むとbackface cullingはTransformやcoordinatesにも関連しており、視点の位置がcullingの方向にも影響を及ぼす可能性があるなど、時間があれば議論する時間があります.すると、取り除いた方向がちょうど逆になります.つまり、元の時計回りの除去は反時計回りの除去になります.
参照先:http://www.cnblogs.com/graphics/archive/2010/11/21/1883139.html DirectX.9.0.3 Dゲーム開発プログラミング基礎
まずbackfaceとは何かを見てみましょう.backfaceがあれば必ずfrontfaceがあります.DXではfrontfaceはこのように定義されています.頂点定義の前後順に時計回りに並ぶ頂点からなる三角形はfrontface(view spaceを参照)、frontfaceと対向する面はbackfaceです.下図のように.
frontfaceを決定する要因は2つあることがわかります
頂点定義の前後順序頂点の配列方向-時計回りまたは反時計回り(頂点の位置座標によって決まる).
まず1つ目を見て、頂点の位置が変わらないが、定義の順序が変わった場合、frontfaceがbackfaceになる可能性があります.以下の図です.
2つ目を見ると、頂点の定義順序が変わらないが、位置が変わった場合、frontfaceがbackfaceになる可能性もあります.以下の図です.
通常、backfaceは表示されません.レンダリング速度を向上させるために、DXはユーザーがbackfaceを除去できるようにするには、3つの除去方法があります.
D3DCULL_NONE-を削除しない
D3DCULL_CW-時計回りに削除D3DCULL_CCW-反時計回りに削除(これはDXのデフォルトの削除方法).
このコードは、次のコードは6つの頂点を定義し、2つの三角形を描くことができます.さまざまな除去方法がどのように動作しているかを見てみましょう.頂点数が少ないため、ここではIndexBufferを使用せず、そのままVertexBufferで操作しており、便宜上、D 3 DFVF_を採用しているXYZRHW | D3DFVF_DIFFUSE形式の頂点、TransformとLighting操作を省く
ScreenVertex Vertices[] =
{
{ 50.0f, 100.0f, 0.0f, 1.0f, 0xffff0000}, // 0
{100.0f, 50.0f, 0.0f, 1.0f, 0xffff0000}, // 1
{150.0f, 100.0f, 0.0f, 1.0f, 0xffff0000}, // 2
{200.0f, 50.0f, 0.0f, 1.0f, 0xffff0000}, // 3
{250.0f, 100.0f, 0.0f, 1.0f, 0xffff0000}, // 4
{300.0f, 50.0f, 0.0f, 1.0f, 0xffff0000}, // 5
};
除去方式1-D 3 DCULL_NONE
何も除去しないので、2つの三角形が表示されます.
g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE) ;
除去方式2-D 3 DCULL_CW
時計回りに削除、v 0、v 1、v 2は時計回りに配列されているため、最初の三角形は削除され、2番目だけが表示されます.
g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW) ;
除去方式3-D 3 DCULL_CCW
反時計回りに削除、v 3、v 4、v 5は反時計回りに配列されているため、2番目の三角形は削除され、1番目の三角形のみが表示されます.
g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW) ;
削除方法を指定しないで、結果はD 3 DCULL_と同じです.CCW、D 3 DCULL_CCWはデフォルトの消去方式です.
練習して
D 3 Dのデフォルトの消去方法(反時計回りの消去)に従って、正しい頂点の順序はどのようなものですか?vertex bufferを使用するとします.
各面の三角形を定義する際には、必ずこの面に向かっている、すなわち、この面法ベクトルの相対的な方向でこの面を観察し、三角形の頂点の順序を定義することが立方体で特に重要であることに注意してください.正しい順番は以下の通りです.
CUSTOMVERTEX vertices[] =
{
A, E, H, A, H, D, // front face E,H,A,H,D,A, , !
C, G, F, C, F, B, // back face
B, F, E, B, E, A, // left face
D, H, G, D, G, C, // right face
E, F, G, E, G, H, // top face
D, C, B, D, B, A, // bottom face
};
さらに進むとbackface cullingはTransformやcoordinatesにも関連しており、視点の位置がcullingの方向にも影響を及ぼす可能性があるなど、時間があれば議論する時間があります.すると、取り除いた方向がちょうど逆になります.つまり、元の時計回りの除去は反時計回りの除去になります.