2

私は OpenGL で透明度を実装しようとしています。私が読んだことから、最初にすべての不透明なオブジェクトをレンダリングしてから、透明なオブジェクトを正しい順序でレンダリングする必要があります。

私の問題は、不透明なオブジェクトを最初にレンダリングできるように、シーン グラフで不透明なオブジェクトを透明なオブジェクトから分離する方法です。私のシーン グラフは、エンティティをアタッチできるノードの束で構成され、各エンティティは、それぞれが 1 つ以上のテクスチャを持つ、異なるマテリアルを持つ複数のメッシュで構成できます。

シーンをグラフにロードする場合、部分的または完全に透明なマテリアルを知る必要があります。つまり、ロードされたテクスチャのアルファ値が 1 より小さいかどうかを確認する必要があります。現在、Assimp を使用してモデル/シーンのロードを処理していますおよびSOiLを使用してテクスチャを読み取りますが、透明な素材と不透明な素材を分離する簡単な方法は見つかりませんでした.

同じ質問をした人は他にいないので、これはおそらく非常に簡単な解決策ですが、私はまだ OpenGL を使い始めており、過去数時間この問題に悩まされています。

透明化は通常どのように行われ、不透明なオブジェクトは部分的または完全に透明なオブジェクトからどのように分離され、最初にレンダリングされるのでしょうか?

4

1 に答える 1

1

ほとんどのレンダリング方法では、不透明オブジェクトを透明オブジェクトから厳密に分離する必要はありません。考えてみれば、透明性(または不透明性)は継続的な品質です。OpenGL では、アルファ コンポーネントは通常、不透明度を定義するために使用されます。不透明なオブジェクトのアルファ値は 1.0 ですが、これは連続スペクトルの 1 つの値にすぎません。すべてのアルファ値を正しく処理できるメソッドは、アルファ値がたまたま 1.0 であるという理由だけで突然失敗することはありません。

別の言い方をすれば、アルファ値が 0.9 のオブジェクトは不透明ですか? アルファ値が 0.99 の場合、アルファ値 1.0 とは異なる扱いを正当化できますか? それは実際にはすべて継続的であり、二者択一ではありません。

そうは言っても、不透明なオブジェクトを異なる方法で扱うのが一般的である理由があります。私が考えることができる主なもの:

  1. 一般的な単純な透明度レンダリング方法では不透明でないオブジェクトをソートする必要があるため、不透明でないオブジェクトのみをソートすることで作業を節約できます。並べ替えは安くはなく、この方法で処理時間を短縮できます。これらの方法のほとんどでは、すべてのオブジェクトをソートすることで完全に優れた結果が得られますが、効率が低下します。

  2. 多くの場合、オブジェクトを完全に並べ替えることができないか、少なくともそうするのは簡単ではありません。明らかな問題は、オブジェクトがオーバーラップする場合ですが、課題はそのケースを超えています (問題のあるケースの詳細な図については、こちらの回答を参照してください: OpenGL の透明性に関するいくつかの質問)。このような場合、不適切な並べ替えによってアーティファクトが発生します。深度テストを有効にして不透明なオブジェクトを描画することにより、それらのオブジェクトのアーティファクトの可能性を回避し、目立つアーティファクトの全体的な発生を減らします。

どのオブジェクトに透明度が含まれているかわからないという状況は、やや珍しいようです。ほとんどの場合、レンダリングとコンテンツを制御しているため、どのオブジェクトが不透明であるかがわかります。したがって、オブジェクトが不透明かどうかを指定する属性を持つことは、通常、ほとんど無料です。

不透明なオブジェクトを定義する方法が本当にない場合は、いくつかのオプションが思い浮かびます。1 つ目は、すべてのオブジェクトを並べ替えて、順番にレンダリングすることです。上記の説明に基づいて、パフォーマンスまたは品質の低下が発生する可能性がありますが、試してみる価値があります。

不透明なオブジェクトと透明なオブジェクトを並べ替えたり分離したりする必要なく、透明度を使用してレンダリングできるメソッドがあります。頭に浮かぶ単純なものは、alpha-to-coverage です。特に、とにかく MSAA でレンダリングする場合、オーバーヘッドは発生しません。欠点は、シーンの性質によっては品質が平凡になる可能性があることです。しかし、もう一度試してみる価値があります。

alpha-to-coverage の基本的な説明と、他のいくつかの単純な透明度レンダリング方法については、この質問に対する私の回答OpenGL ES2 Alpha test problemsで見つけることができます。

最近のハードウェア機能に部分的に依存する、より高度な透明度レンダリング方法があります。それらをカバーすることは、ここでの投稿の範囲を超えています (また、私の知識を大幅に超えています...) が、「順序に依存しない透明性」を検索することで資料を見つけることができるはずです。

于 2015-12-29T06:31:43.000 に答える