★お知らせ(2023/12/27)
いつもLive2D公式コミュニティをご利用いただき誠にありがとうございます。
本コミュニティは2023年12月27日 11:00をもって閉鎖いたしました。
今後の運営はすべて新Live2D公式クリエイターズフォーラムに移行します。
閉鎖に伴い、以下機能は利用不可となります。
・アカウントの新規作成
・トピック投稿、返信
たくさんのご利用誠にありがとうございました。

新Live2D公式クリエイターズフォーラムは以下バナーよりご利用いただけます。
Live2D公式クリエイターズフォーラム

なお、本コミュニティに投稿されたトピックはすべて残りますが、今後削除する可能性がございますので予めご了承ください。
閉鎖に関するお問い合わせにつきましてはLive2D公式クリエイターズフォーラムへご連絡ください。

モデルのパーツの表示・非表示についてご質問

DirectX9でLive2Dを使用しています。
解決できない問題があり、ご質問させて頂きます。

プログラムおよび素材はSDKに添付されていたSampleApp1とharuを使用しています。

自作のシェーダを通して描画を行ったところ、
本来は非表示のパーツが表示されてしまう現象です。
具体的には、腕を組んだ状態と腕を下ろした状態が重なって表示されます。
シェーダなしの描画だと腕を組んだ状態が非表示になり、正常に表示されます。

Cubism SDKにALive2DModel::setPartsOpacity関数があるのですが、
マニュアルには上記関数がパーツの表示・非表示に対応しているとありました。
こちらで以下のように対応したのですが、全く効果がありませんでした。

腕を下ろした状態を表示
ALive2DModel::setPartsOpacity("PARTS_01_ARM_L_A_001", 1);
ALive2DModel::setPartsOpacity("PARTS_01_ARM_R_A_001", 1);

腕を組んだ状態を非表示
ALive2DModel::setPartsOpacity("PARTS_01_ARM_L_B_001", 0);
ALive2DModel::setPartsOpacity("PARTS_01_ARM_R_B_001", 0);

以上、解決方法が見つからなく困っています。
どなたかご存知の方がいらっしゃいましたらよろしくお願い致します。

コメント

  • 自作のシェーダは、モデルを描画したオフスクリーンに対して実行しておられるでしょうか?
    モデルのdraw()内では、ライブラリ側のシェーダが使われているはずなので、
    もしですが、これに直接バッティングするタイミングで自作のシェーダが実行されている場合は、
    表示がおかしくなる(描画周りの関数が効かなくなるように見える)ことはありそうに思います。

    ・「他のシステムとの連携について」→「描画の詳細」
    http://sites.cybernoids.jp/cubism2/sdk_tutorial/first/adapt
    >シェーダは基本的なテクスチャのアルファブレンド処理のみ
    ↑このライブラリ側のシェーダと自作シェーダがぶつかってしまっているのでしょうか?

    もしくは、PARTS_01_ARM_L_A_002系が何かの原因で表示されていて、
    001系を指定したsetPartsOpacityは動いているのに腕は描画されている、とかでしょうか?
    (シェーダなしの場合は正常に表示されているとのことなので、こちらの可能性は薄そうですね)

  • ご回答ありがとうございます。

    >・「他のシステムとの連携について」→「描画の詳細」
    >http://sites.cybernoids.jp/cubism2/sdk_tutorial/first/adapt

    上記の記載事項を確認していませんでした。

    ご回答を踏まえて以下にまとめました。

    自作のシェーダはデフォルトのフレームバッファに直接描画していますので、
    上記記載事項の場合、「1.スクリーンにLive2Dを直接描画する場合」の項目にあたります。
    ご回答の通り、ライブラリ側のシェーダ(この場合は「シェーダは基本的なテクスチャのアルファブレンド処理のみ」)の描画処理と
    こちらの自作シェーダとの描画処理がぶつかっていそうです。
    モデルの draw() 処理を実行する前に自作シェーダを実行する手順で描画しています。
    そのためぶつかった事による内部の動作の詳細は分からないのですが、
    結果としてこちらが思った通りの描画結果が得られていないようです。
    以上です。

    現時点の方法だと各パーツの表示・非表示は実現は厳しそうなので、
    別の方法(オフスクリーン方式など)を検討したいと思います。

    色々悩んでいた部分がすっきりして、大変助かりました。
    ありがとうございました。
コメントするにはサインインまたは登録して下さい。