Nanashi-softプログラマ専用DirectX11開発


◇DirectX11プログラミング -四角形・五角形・六角形-

サンプルの三角形を四角形にしてみます
要するに,ポリゴンを増やすにはどうするのか? と言う話です(だと思う)

頂点数が3つで三角形,4つで四角形だと,単純に考えて('-'*)
	const int TYOUTEN = 3;	//ポリゴンの頂点数
↓4に変更
	const int TYOUTEN = 4;	//ポリゴンの頂点数
当然,頂点データも4つ分,というか四角形のものが必要だろうと
	//頂点データ(三角ポリゴン1枚)
Vertex3D hVectorData[TYOUTEN] = {
{ { +0.0f, +0.5f, +0.5f }, { 1.0f, 1.0f, 1.0f, 1.0f } },
{ { +0.5f, -0.5f, +0.5f }, { 1.0f, 1.0f, 1.0f, 1.0f } },
{ { -0.5f, -0.5f, +0.5f }, { 1.0f, 1.0f, 1.0f, 1.0f } }
};
↓四角形に変更
	//頂点データ(四角ポリゴン1枚)
Vertex3D hVectorData[TYOUTEN] = {
{ { +0.5f, +0.5f, +0.5f }, { 1.0f, 1.0f, 1.0f, 1.0f } },
{ { -0.5f, +0.5f, +0.5f }, { 1.0f, 1.0f, 1.0f, 1.0f } },
{ { +0.5f, -0.5f, +0.5f }, { 1.0f, 1.0f, 1.0f, 1.0f } },
{ { -0.5f, -0.5f, +0.5f }, { 1.0f, 1.0f, 1.0f, 1.0f } }
};
頂点バッファ作成時のデータ量や,描画時の頂点数は TYOUTEN定数で変わるようにしておいたので,これで実行すれば四角形になる‘はず’です

実行してみる
あれ? 何も描画されない('-'*)?

ああそうだ,ポリゴンって裏から見ると見えないんだっけ?
ベクトル方向とかわかるかヴォケ~~ヽ(`Д´)ノ
こういうアフォ用に,ラスタライザーというポリゴンの裏表が関係無くなる機能(?)がありました(注意:本来そう言う用途で使うものでは無いと思います)

初期化の一番最後,ビューポート設定のすぐ下に追記します
	ID3D11RasterizerState* hpRasterizerState = NULL;
D3D11_RASTERIZER_DESC hRasterizerDesc = {
D3D11_FILL_SOLID,
D3D11_CULL_NONE, //ポリゴンの裏表を無くす
FALSE,
0,
0.0f,
FALSE,
FALSE,
FALSE,
FALSE,
FALSE
};
if(FAILED(hpDevice->CreateRasterizerState(&hRasterizerDesc, &hpRasterizerState))){
MessageBox(hWnd, _T("CreateRasterizerState"), _T("Err"), MB_ICONSTOP);
goto End;
}

//ラスタライザーをコンテキストに設定
hpDeviceContext->RSSetState(hpRasterizerState);
ちなみに,D3D11_FILL_SOLIDを,D3D11_FILL_WIREFRAMEにするとワイヤーフレーム表示になるっぽいです(最初それでハマりました)

再度実行してみる

あれ? 半分しか描画されない('-'*)?

四角形を描いているサンプルを探して見比べると,プリミティブを変えないといけないらしい
	//プリミティブ(ポリゴンの形状)をコンテキストに設定
hpDeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
↓4頂点に変更
	hpDeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
ていうか,ここ調べた時に自分でポリゴンの形状指定だとコメント書いてたし(^^;

はい,四角形でました

●五角形を表示してみる
普通は,三角形と四角形で説明が終わります
でも,考えてみて下さい,そういう決まった形は,ポンと出せる命令とかありそうでしょ?
うちのサイトでは,更に上を目指します

調子に乗って,頂点数を5つに増やす
	const int TYOUTEN = 5;	//ポリゴンの頂点数
頂点データを5つ分用定義する
	//頂点データ(五角ポリゴン1枚)
Vertex3D hVectorData[TYOUTEN] = {
{ { +0.0f, +0.8f, +0.5f }, { 1.0f, 1.0f, 1.0f, 1.0f } },
{ { +0.5f, +0.5f, +0.5f }, { 1.0f, 1.0f, 1.0f, 1.0f } },
{ { -0.5f, +0.5f, +0.5f }, { 1.0f, 1.0f, 1.0f, 1.0f } },
{ { +0.5f, -0.5f, +0.5f }, { 1.0f, 1.0f, 1.0f, 1.0f } },
{ { -0.5f, -0.5f, +0.5f }, { 1.0f, 1.0f, 1.0f, 1.0f } }
};
プリミティブ(ポリゴンの形状)は変更しなくても描画されました
ほら,三角形は専用命令だった(違うかも知れません)

形が変だとか,そういうのはどうでもいいです(*'-')
要するに点を5つ送って,5角形になるかどうか? が重要なのです

●六角形を表示してみる
それって必要ある? とか考えたら負けかな(*'-')
なんかバグってて,四角形のところに五角形送っても表示できたのかも知れません
うちのサイトでは,更に上を目指します ←

頂点数を6つに増やす
	const int TYOUTEN = 6;	//ポリゴンの頂点数
頂点データを6つ分用定義する
	//頂点データ(六角ポリゴン1枚)
Vertex3D hVectorData[TYOUTEN] = {
{ { +0.0f, +0.8f, +0.5f }, { 1.0f, 1.0f, 1.0f, 1.0f } },
{ { +0.5f, +0.5f, +0.5f }, { 1.0f, 1.0f, 1.0f, 1.0f } },
{ { -0.5f, +0.5f, +0.5f }, { 1.0f, 1.0f, 1.0f, 1.0f } },
{ { +0.5f, -0.5f, +0.5f }, { 1.0f, 1.0f, 1.0f, 1.0f } },
{ { -0.5f, -0.5f, +0.5f }, { 1.0f, 1.0f, 1.0f, 1.0f } },
{ { +0.0f, -0.8f, +0.5f }, { 1.0f, 1.0f, 1.0f, 1.0f } }
};

でました(^_^)


TOPプログラマ専用DirectX11開発

メイナの実験場~裸マント文乃ちゃん~ネコミトリ 詰めピラミッド+