アルファ ブレンディングまたはアルファ テストのいずれかで動作するはずのシェーダーがありますが、渡されるカラー値は乗算済みのアルファ値です。
事前に乗算されたアルファを使用するときに、アルファ ブレンディングとアルファ テストの両方で「正しい」結果を生成する簡単で標準的な方法はありますか?
たとえば、シェーダーの最終結果がRGBA(1,0,0,0.75)
ストレート アルファであり、したがって事前に乗算されたアルファである場合、アルファ テスト時にRGBA(0.75,0,0,0.75)
結果が残るはずです。RGBA(1,0,0,0.75)
おそらく 1 つのオプションは、アルファ テストを行う場合、アルファ チャネルを「分割」することです。つまり、元の赤の値を取得するために、上記で を分割R
します。しかし、アルファが 0 になると、これは非決定論的になります。A
0.75/0.75 = 1.0
バック バッファーがRGBA(1,1,1,1)
で、部分的に透明な緑色RGBA(0,1,0,0.75)
(ストレート アルファ) でレンダリングしているとします。色は、乗算済みアルファ as として渡されRGBA(0,0.75,0,0.75)
ます。アルファブレンディングの場合、1 + invsrcalpha を使用してブレンドし、最終的な色を取得しRGBA(0.25,1,0.25,1)
ます。したがって、バック バッファーには 100% の緑があり、元の緑の色もそうであるため、私の緑のチャンネルは 100% のままです。したがって、緑のチャンネルで 100% 未満になる方法はありません。
アルファテストでは、ブレンドは行われません。代わりに、私の緑色は としてバック バッファに直接レンダリングされRGBA(0,0.75,0,1)
ます。でも欲しかった色はRGBA(0,1,0,1)
.