benikabocha / saba

OpenGL Viewer (OBJ PMD PMX)
MIT License
442 stars 60 forks source link

アルファチャンネル問題,モデルがalphaに存在する場合、表示がおかしい #15

Closed WLiangJun closed 4 years ago

WLiangJun commented 4 years ago

まず、sabaライブラリを使って、自分のMMDデスクトップマスコットプログラムを作ってみたのですが、窓の背景と枠を透明にしてみたら、モデルがalphaを持っている限り!=0とすると,2つの問題が存在する: 1.もし,外層が半透明であれば,中にまったく不透明なものがあっても,デスクトップの背景の内容が透過してしまう。

2.背景が薄いとモデルが明るさを増しておかしくなる。黒一色の背景でのみ正常に表示される。

sabaのライブラリの面で相応の修正をして、この問題を解決できますか?ありがとうございます。問題の具体的な表現は次の2つのスクリーンショットです: 左正規モデルの場合のcharamin OMPの効果。 001_1 002_2

benikabocha commented 4 years ago

これは以下のような、レンダーテクスチャとアルファブレンドの問題だと思います。 https://qiita.com/luckin/items/43a8a98a88a3ba20e92b

解決方法は以下のようになります。

  1. Render Target(Render Texture) を (0.0, 0.0, 0.0 1.0) でクリアする
  2. Render Texture 描画時の Blend State を以下のように設定する
    SrcBlend = D3D11_BLEND_SRC_ALPHA
    DestBlend = D3D11_BLEND_INV_SRC_ALPHA
    BlendOp = D3D11_BLEND_OP_ADD
    SrcBlendAlpha = D3D11_BLEND_ZERO
    DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA
    BlendOpAlpha  = D3D11_BLEND_OP_ADD
  3. Render Texture をデスクトップへ描画する際の Blend State を以下のように設定する
    SrcBlend = D3D11_BLEND_ONE
    DestBlend = D3D11_BLEND_INV_SRC_ALPHA
    BlendOp = D3D11_BLEND_OP_ADD
    SrcBlendAlpha = D3D11_BLEND_ONE
    DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA
    BlendOpAlpha = D3D11_BLEND_OP_ADD
WLiangJun commented 4 years ago

アドバイスありがとうございます。あなたが提案したのはdx11のそのバージョンで、私はあなたが言った通りに変更しても元の問題です(上で述べた2つの問題と違い、上の問題はglfw sampleとsaba_viewerの存在する小さな問題です)。dx11とglfwの2つのsampleを試したんですが、枠と背景色を抜いてアルファブレンドするとおかしいです。これはdx11の問題です: 003 あなたにたくさんの質問をして申し訳ありませんが、本当に解決したいです。

benikabocha commented 4 years ago

glfw の GLFW_TRANSPARENT_FRAMEBUFFER を使用しているみたいですね。

以下のように描画すればうまくいくかもしれません。

  1. FBO Texture へモデルを描画する
    SrcBlend = SrcAlpha DestBlend = InvSrcAlpha SrcBlendAlpha = Zero DestBlendAlpha = InvSrcAlpha
  2. 画面に、1で描画した Texture を描画する
    Blend を OFF に設定し、シェーダーで、 Color = SrcColor / (1.0 - SrcAlpha) Alpha = (1.0 - SrcAlpha) として描画する。

今度、自分でも試してみます。

WLiangJun commented 4 years ago

ありがとうございます。確かにglfwのGLFW_TRANSPARENT_FRAMEBUFFERです。貴重なご提案ありがとうございます。何とかして、この問題を解決できるように頑張ります。私はコンピュータ関連の専門ではないので、この問題は私にとって難しい。時間とエネルギーがあれば試してみても、無理をする必要はありません。でも、後期の更新を楽しみにしています。

benikabocha commented 4 years ago

@WLiangJun glfw のサンプルに透明ウィンドウのオプションを追加しました。 888549e25d62eb9644a202de3ecffc1bae1e64c5 simple_mmd_viewer_glfw -option -model -vmd

WLiangJun commented 4 years ago

ありがとうございます。ちょっと試してみましたが、あなたの助けで、ついにその二つの問題を解決しました。お忙しい中、わざわざcodeを修正していただきありがとうございます。

benikabocha commented 4 years ago

解決できたとのことでよかったです。