MV1SetSemiTransDrawMode

モデルの半透明要素がある部分についての描画モードを設定する

MV1SetSemiTransDrawMode DrawMode

int DrawMode : モデルの半透明要素がある部分についての描画モード
DX_SEMITRANSDRAWMODE_ALWAYS     : 半透明かどうか関係なく描画する( デフォルト )
DX_SEMITRANSDRAWMODE_SEMITRANS_ONLY   : 半透明の部分のみ描画する
DX_SEMITRANSDRAWMODE_NOT_SEMITRANS_ONLY : 半透明ではない部分のみ描画する

(プラグイン / モジュール : DxLibW)

解説

モデルの半透明要素がある部分についての描画モードを設定します。

設定できるモードは以下の3つです。

DX_SEMITRANSDRAWMODE_ALWAYS

半透明の要素があるかどうか関係なく必ず描画します。

デフォルトではこのモードになっています。

DX_SEMITRANSDRAWMODE_SEMITRANS_ONLY

半透明の要素がある部分のみ描画します。少しでも半透明の要素がある場合は描画され、

半透明の要素が少しも無い場合は描画されません。

DX_SEMITRANSDRAWMODE_NOT_SEMITRANS_ONLY


DX_SEMITRANSDRAWMODE_SEMITRANS_ONLY とは逆に半透明の要素が少しでもある部分は

描画されないモードです。

この関数を呼んだ後の MV1DrawModelMV1DrawFrameMV1DrawMeshMV1DrawTriangleList の呼び出しに影響を与えます。

この関数の用途ですが、主に「描画する全ての3Dモデルの半透明要素が無い部分のみ」を先に描画して、
その後に「描画する全ての3Dモデルの半透明要素がある部分のみ」を描画するために使用します。

何故先に「半透明要素が無い部分のみ」を描画する必要があるのかと言いますと、
それは3D描画の前後関係解決に使用されるZバッファと半透明描画の相性の悪さにあります。

Zバッファは「3D描画を行った際の各ピクセルの奥行き」を記録しておき、
後から同じピクセルに対して3D描画された際に「前回の3D描画を行った際に記録しておいた奥行き」より
「後から行った3D描画の奥行き」の方が大きい( 奥にある )場合は描画せず、
小さい( 手前にある )場合は描画するという処理をしてくれるもので、3D描画にはとても便利(
2D描画のように手前に表示したいものを後から描画しないといけない、といった前後関係を気にする必要が無くなる為 )
な機能なのですが、この機能は半透明描画とはとても相性が悪いのです。

例えば「半透明のもの」は本来「半透明のものより奥のもの」が透けて見えますが、
このZバッファの機能を使用しながら「半透明のもの」を「半透明のものより奥にあるもの」より先に描画してしまうと、
「半透明のものより奥にあるもの」を後から描画してもZバッファに「既にもっと手前に描画されたものがあるから描画しません」
と、本来なら「半透明のもの」が透けてその奥に見える筈の「半透明のものより奥にあるもの」が描画されないという事態を引き起こしてしまいます。

この問題を回避するには、以下の様な手順で描画を行う必要があります。


1.半透明要素が無いものを全て描画する


2.半透明要素があるものを、奥のものから順番に描画する

まずZバッファと相性の良い「半透明要素が無いもの」を先に全て描画してしまい
『半透明のものの奥にあるはずのものが表示されていない』という事態を回避します。

その次に、Zバッファと相性の悪い「半透明要素があるもの」を奥のものから順番に描画します。

( 前述の通り半透明のものはZバッファを頼りにした前後関係の解決は望めないため )

これで正常な描画結果を得ることができます。

尚、「半透明要素があるもの」を奥のものから順番に描画しなかった場合に不都合が発生するのは

『「半透明要素があるもの」同士が画面内で重なり、

且つ手前にある「半透明要素があるもの」が先に描画された場合』


なので、
「半透明要素があるもの」が少なく、滅多に「半透明要素があるもの」同士が画面内で重なることが無い、
重なっても一瞬で気付かない程度、という場合は「半透明要素があるもの」についても前後関係を無視して描画してしまうのもありです。
( 奥のものから順番に描画するためのソート処理は負荷が高いことも多いので )

改めて MV1SetSemiTransDrawMode の用途ですが、上記の「半透明要素が無いものを先に全て描画する」
「半透明要素があるものを後から全て描画する」を実現するために使用します。


「半透明要素が無いものを先に全て描画する」を行う場合は DrawMode に
DX_SEMITRANSDRAWMODE_NOT_SEMITRANS_ONLY を渡して MV1SetSemiTransDrawMode を呼び出した後に全ての3Dモデルを MV1DrawModel で描画、

「半透明要素があるものを後から全て描画する」を行う場合は DrawMode に
DX_SEMITRANSDRAWMODE_SEMITRANS_ONLY を渡して MV1SetSemiTransDrawMode を呼び出した後に全ての3Dモデルを MV1DrawModel で描画します。

戻り値:
  0:成功

情報

プラグイン / モジュールDxLibW
バージョン3.24f
作成日2026/04/12
著作者DxLib: Takumi Yamada / HSP binding: IronHSP Project
URLhttps://dxlib.xsrv.jp/
備考hspdxlib.as をインクルードして使用
タイプDxLib ゲームライブラリ
グループDxLib 3Dモデル
対応環境
  • Windows 版 HSP
hs ファイルhsphelp\hspdxlib.hs