お世話になっております。
現在、自前のシェーダーを用いた(DrawPolygon3DToShaderを使用した)モデルの描画に取り組んでいるのですが、
非透過度が低い(透明に近い)材質が不透明に描画される、という現象に悩まされています。
MV1LoadModelで読み込んだ時には正常に透明に近い描画がされるので、設定か何かを間違えていると思うのですが、
どの辺に問題があるか、ご教示いただけませんでしょうか。
使用言語: C#(.NET Framework 4.7.2)
OS: Windows 10 64bit
--------------------
■ 事象
1. DiffuseColor:(1, 1, 1, 0.01)
テクスチャ色:不透明白
→ 不透明白で描画される
2. DiffuseColor:(1, 1, 1, 0.001)
テクスチャ色:不透明白
→ 透明で描画される
3. DiffuseColor:(1, 1, 1, 0.2)
テクスチャ色:不透明赤
→ 不透明白で描画される
--------------------
■ プログラム(描画周りの設定のみ)
if (DxLib_IsInit() == FALSE)
{
// ウィンドウモードで描画
ChangeWindowMode(TRUE);
// Direct3D9Ex を使用する
SetUseDirect3DVersion(DX_DIRECT3D_9EX);
// DxLib_Init の前に出力先ウインドウを SetUserWindow で指定する
SetUserWindow(ViewerBox.Handle);
// 背景色設定
SetBackgroundColor(140, 140, 140);
// 計算速度を犠牲にしてでも精度を double で計算する
SetUseFPUPreserveFlag(TRUE);
// 透過色を指定しない、これが無いとデフォルトでは黒が透過されてしまう
SetUseTransColor(FALSE);
// 初期化
DxLib_Init();
// クリップ
SetCameraNearFar(0.1f, 1000.0f);
}
else
{
// 初期化済みならば、ターゲットを再設定する
SetScreenFlipTargetWindow(ViewerBox.Handle);
}
// 頂点シェーダーを読み込む
VsHandle = LoadVertexShader(MFileUtils.GetTempResourcePath(Properties.Resources.basicVS, ".vso"));
// ピクセルシェーダーを読み込む
PsHandle = LoadPixelShader(MFileUtils.GetTempResourcePath(Properties.Resources.basicPS, ".pso"));
// 使用する頂点シェーダーのセット
SetUseVertexShader(VsHandle);
// 使用するピクセルシェーダーをセット
SetUsePixelShader(PsHandle);
// 標準ライトの向きを定義
lightDirection = Vector3.Normalize(lightPosition) * -1;
// モデルの材質ごとに設定 ------
TextureHandle = LoadGraph(TexturePath);
VERTEX3DSHADER配列の生成
// -------------
// pngなどの透過チャンネルを有効に設定
SetMovieColorA8R8G8B8Flag(TRUE);
// 画像を読み込んだ後、乗算済みアルファ画像に変換する設定を有効にする
SetUsePremulAlphaConvertLoad(TRUE);
// 描画モードをバイリニアフィルタリングにする
SetDrawMode(DX_DRAWMODE_BILINEAR);
// 乗算済みアルファ画像用のαブレンドの設定にする
SetDrawBlendMode(DX_BLENDMODE_PMA_ALPHA, 255);
// タイマー内部処理 -----------------
ClearDrawScreen();
// Zバッファを使用する
SetUseZBuffer3D(TRUE);
// Zバッファへの書き込みを行う
SetWriteZBuffer3D(TRUE);
// Z値との比較モードを設定する
SetZBufferCmpType(DX_CMP_LESSEQUAL);
// 描画先を裏画面にする
SetDrawScreen(DX_SCREEN_BACK);
// モデルの材質ごとに描画 ------
// バックカリングを行わない(両面描画)
SetUseBackCulling(FALSE);
// ライト色を加味したDiffuseColor
Vector4 diffuseColor = mesh.Material.DiffuseColor._Vector * lightAmbient
+ new Vector4(mesh.Material.AmbientColor.X, mesh.Material.AmbientColor.Y, mesh.Material.AmbientColor.Z, 0.0f);
SetVSConstF(60, F4Get(diffuseColor.X, diffuseColor.Y, diffuseColor.Z, diffuseColor.W));
// シェーダーを使ってポリゴン描画
DrawPolygon3DToShader(mesh.DxVertices, (int)(mesh.Material.VerticesCount / 3));
// -------------
// --------------------------
--------------------
■ 頂点シェーダー
// main関数
VS_OUTPUT main( VS_INPUT IN )
{
VS_OUTPUT Out;
// 頂点カラー
Out.Color = DiffuseColor;
// 関数の戻り値がピクセルシェーダーに渡される
return Out ;
}
--------------------
■ ピクセルシェーダー
// main関数
PS_OUTPUT main( PS_INPUT IN )
{
PS_OUTPUT Out;
Out.Color = IN.Color;
// 関数の戻り値がラスタライザに渡される
return Out;
}
--------------------
あちこち試していたので不要な設定が入っているかもしれません。
お手数をおかけして申し訳ありませんが、ご確認の程、よろしくお願いいたします。