トップページ > 記事閲覧
非透過度が低い材質が不透明に描画される
名前:梶井 日時: 2022/09/07 13:57

お世話になっております。 現在、自前のシェーダーを用いた(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; } -------------------- あちこち試していたので不要な設定が入っているかもしれません。 お手数をおかけして申し訳ありませんが、ご確認の程、よろしくお願いいたします。
メンテ

Page: 1 |

Re: 非透過度が低い材質が不透明に描画される ( No.1 )
名前:管理人 日時:2022/09/08 00:25

恐らく SetDrawBlendMode(DX_BLENDMODE_PMA_ALPHA, 255); ↑ こちらを SetDrawBlendMode(DX_BLENDMODE_ALPHA, 255); ↑ このように変更していただくか // main関数 PS_OUTPUT main( PS_INPUT IN ) { PS_OUTPUT Out; Out.Color = IN.Color; // 関数の戻り値がラスタライザに渡される return Out; } ↑ こちらを // main関数 PS_OUTPUT main( PS_INPUT IN ) { PS_OUTPUT Out; Out.Color = IN.Color; // rgbにaを乗算する( 乗算済みα用の処理 ) Out.Color.rgb = Out.Color.a; // 関数の戻り値がラスタライザに渡される return Out; } ↑ このように変更していただくことで正常な透明度で描画されると思います ( 前者が『乗算済みαを使わないようにする』ことで解決する方法で、  後者が『シェーダーコードを乗算済みα用に書き換える』ことで解決する方法です  ( 乗算済みαでは、ピクセルシェーダーが出力する色の値を『乗算済みα』用の値 ( rgb に a が乗算された値 )にする必要があります ) ) よろしければお試しください m(_ _)m
メンテ
Re: 非透過度が低い材質が不透明に描画される ( No.2 )
名前:梶井(解決済) 日時:2022/09/08 07:55

迅速なご回答、誠にありがとうございます! 後者の方(出力する色の値を『乗算済みα』用の値にする)で非透過度が低い材質が透明に近い形で描画されました。 大変助かりました。 今後ともどうぞよろしくお願いいたします。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存