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


◇DirectX11プログラミング -DirectX11での透過はブレンディングステートを使う-

ところで,三角ポリゴンに分割したポリゴンにテクスチャーを貼るにはどうすればいい?('-'*)
ミクのデータは瞳の部分だけがテクスチャーになっています
そこにうまく貼ることができません

調べてもわからないので,放置して別の問題に取り組んでいました
DirectX11では,モデルデータ中にマテリアルとテクスチャーは共存できません
と言うのも,それぞれ別のピクセルシェーダープログラムだからです

この問題は,システムを組み直しているので,次にするとします

昼休みに弁当を食べながら,なんとなく PMDデータを眺めていて
ふと思いました
この頂点データにある「uv」って,UVマップとか言うやつじゃない?('-'*)?
なんか聞いたことがあると言う知識レベルなので,ググってみる。やっぱりテクスチャーを貼る時の座標だ

今までの傾向から言って,PMDデータ形式は DirectXと親和性が高い作りになっている(リトルエンディアンだし)
ので,テクスチャー座標に全部ぶっこんでみた
	for(int i=0; i < TYOUTEN; i++){
hVectorData[i].pos[0] = modeldata->vertex[i].pos[0];
hVectorData[i].pos[1] = modeldata->vertex[i].pos[1];
hVectorData[i].pos[2] = modeldata->vertex[i].pos[2];
hVectorData[i].col[0] = 0.0f;
hVectorData[i].col[1] = 0.0f;
hVectorData[i].col[2] = 0.5f;
hVectorData[i].col[3] = 1.0f;
// hVectorData[i].tex[0] = 0.0f; ↓そのままぶっこむ
hVectorData[i].tex[0] = modeldata->vertex[i].uv[0];
// hVectorData[i].tex[1] = 1.0f; ↓そのままぶっこむ
hVectorData[i].tex[1] = modeldata->vertex[i].uv[1];
}
ピクセルシェーダーを,テクスチャー描画の方にして
		hpDeviceContext->PSSetShader(hpPixelShader, NULL, 0);
計算して,目の部分だけを描画する
		hpDeviceContext->DrawIndexed(480, 38997, 0);

できた~(^_^)

ん? ('-'*)
なんかちょっと変?

白目の部分も黒いっぽい
eye2.bmpを見てみると,確かに周囲が黒かった
BMP形式だし,黒が透過色と言うルールなの?

そう言えば,前からαが無効だったのはなぜか不思議だったな(ぉ
これを機に調べてみると,ブレンディングステートとかいうのを使うらしいです
OMSetBlendStateでコンテキストに設定するそうで,やってみた

できないorz
て言うか,いったいどこに透過色を設定する関数が存在するんだ?

ああそうだ。もっと単純に考えればいいんだ
bmp形式だから透過色が無い,というのが難しくしている原因なので
png形式に変換すればいいんだ(*'-')

↓こういう風に設定したら透過された
	//ブレンディングステート生成
ID3D11BlendState* hpBlendState = NULL;
D3D11_BLEND_DESC BlendStateDesc;
BlendStateDesc.AlphaToCoverageEnable = FALSE;
BlendStateDesc.IndependentBlendEnable = FALSE;
for(int i=0; i < 8; i++){
BlendStateDesc.RenderTarget[i].BlendEnable = TRUE;
BlendStateDesc.RenderTarget[i].SrcBlend = D3D11_BLEND_SRC_ALPHA;
BlendStateDesc.RenderTarget[i].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
BlendStateDesc.RenderTarget[i].BlendOp = D3D11_BLEND_OP_ADD;
BlendStateDesc.RenderTarget[i].SrcBlendAlpha = D3D11_BLEND_ONE;
BlendStateDesc.RenderTarget[i].DestBlendAlpha = D3D11_BLEND_ZERO;
BlendStateDesc.RenderTarget[i].BlendOpAlpha = D3D11_BLEND_OP_ADD;
BlendStateDesc.RenderTarget[i].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
}
hpDevice->CreateBlendState(&BlendStateDesc, &hpBlendState);

//そのブレンディングをコンテキストに設定
float blendFactor[4] = {D3D11_BLEND_ZERO, D3D11_BLEND_ZERO, D3D11_BLEND_ZERO, D3D11_BLEND_ZERO};
hpDeviceContext->OMSetBlendState(hpBlendState, blendFactor, 0xffffffff);

きちんと透過部分が反映されています
ジャギが凄く出ていますが,それは別の問題だと思います
恐らく拡大する際のテクスチャー計算とか問題でしょう

補足説明として,テクスチャーを読み込む際に,透過色ありの時は設定が少し違いました
	LoadInfo.Format = DXGI_FORMAT_R32G32B32_FLOAT;

	LoadInfo.Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
テクスチャーを読み込む際に透過色指定ができないものかと調べていたので,すぐに気が付きましたが,ハマる可能性もあるところです


TOPプログラマ専用DirectX11開発