物理ベースのシェーディング、鏡面反射パーツと拡散パーツを組み合わせる方法は?


8

しばらくの間、「標準的な」フォン&ブリンシェーダーを書いた後、最近、物理ベースのシェーディングに手を出し始めました。私を大いに助けたリソースは、これらのコースノート、特にこのペーパーです。これは、ブリンを物理的にもっともらしいシェーディングにする方法を説明しています。

私はこの論文で提案されているブリンモデルを実装しました。提案されている最も重要な変更(imo)は、フレネル反射率を含めることであり、これも問題を引き起こす部分です。残念ながら、著者は拡散反射率を省略して鏡面部分のみに焦点を合わせることにしました。たとえば、ランバート拡散反射を考えると、それを「改善された」ブリンと組み合わせる方法がわからないだけです-拡散部分と鏡面部分を追加するだけではもはや正しくないように思えるからです。

一部のシェーダーでは、関与するメディアの屈折率に基づいて、範囲0〜1の浮動小数点「フレネル項」が使用されているのを見ました。シュリックの近似が毎回使用されます:

float schlick( in vec3 v0, in vec3 v1, in float n1, in float n2 )
{
    float f0 = ( n1 - n2 ) / ( n1 + n2 );
    f0 *= f0;   
    return f0 + ( 1 - f0 ) * pow( dot( v0, v1 ), 5 );
} 

このようにすると、フレネル項に基づいて拡散と鏡面反射の寄与を線形補間できます。たとえば、

float fresnel = schlick( L, H, 1.0002926 /*air*/, 1.5191 /*other material*/ );
vec3 color = mix( diffuseContrib, specularContrib, fresnel );

この論文では、著者はこのアプローチが正しくないことを述べています。これは、基本的にLがHに平行またはほぼ平行な場合に鏡面反射光の色を暗くするためです。屈折率に基づいてf0を計算する代わりに、鏡面反射光を扱う必要があります。それ自体をf0として色付けし、次のようにシュリック近似でvec3を計算します。

vec3 schlick( in vec3 v0, in vec3 v1, in vec3 spec )
{
    return spec + ( vec3( 1.0 ) - spec ) * pow( dot( v0, v1 ), 5 );
}

その結果、鏡面反射光の色は、少し見ると白に近づきます。

私の質問は、これに拡散コンポーネントをどのように導入するのですか?90°では、鏡面反射の寄与は完全に白です。つまり、すべての入射光が反射されるため、拡散の寄与はありません。入射角が90°未満の場合、拡散部分全体に(vec3(1)-schlick)を乗算するだけでよいのですか?つまり、反射されない光の割合ですか?

vec3 diffuseContrib = max( dot( N, L ), 0.0 ) * kDiffuse * ( vec3( 1.0 ) - schlick( L, H, kSpec ) );

それとも完全に異なるアプローチが必要ですか?


2
これを解決したことがありますか?私は今まさにこの問題を抱えています。

1
私もその答えをお願いします。ラガルドは、鏡面色の同様のサブラクションも提案してきましたが(最終的には「使用しなかった」)、これはすべて非常に恣意的であるようです。
v.oddou 2017

回答:


1

短い答え:

それは十分によく見えますか?

  • はい-保管してください。

  • いいえ-少しいじってください。

長い答え:

正確で現実的な物理ベースのシェーディングを取得するには、可能な以上のGPUパワーが必要です。コンピューターが可視光スペクトル全体ではなく、宇宙全体をシミュレートできないという単純な理由で、常に偽物に頼らなければなりません。

陰影の「すごい谷」です。

周囲の照明とオクルージョンだけでなく、たとえば日中と月光の外部環境には、大量のUVスペクトル光があり、そのほとんどが有機材料などのさまざまな材料によって可視スペクトルに戻されます。さまざまなタイプの蛍光灯照明とHIDも、かなりの量のUV光を放射します。

効果は微妙ですが、何年にもわたる進化のおかげで、脳は本能的にそれを処理します。これは、良い食事と恐らく長く耐え難い死の間の違いを意味しました。 。

カートゥーン、非現実的、そしてほぼ現実的だが意図的にオフバイマージン(例:Halo)アートスタイルは、この問題を回避します。

別の問題は、モニターが厳密にRGBであるため、2人の人間が同じRYGBL受容体の存在も応答曲線も持たないため、すべての人間の画像を完全に再現できないことです。(赤、黄、緑、青、ルマ、四色性を参照-http ://en.wikipedia.org/wiki/Tetrachromacy

どんなに一生懸命働いても、少なくともどこかに誰かがそれで「何かがおかしい」と改善の余地があります。

これがシェーディングモデルが非常に多い理由の1つです。

これらすべてのために、優れたアーティストは、環境の光と光の反応のレベルをある程度までだまして、「十分に良い」結果(完璧ではない)を達成します。設定をいじって、ごまかすことを許可するだけです。楽しい結果に。


この分野での研究が多すぎて、そのような答えを出せません。
Tara

@ Tara、Stack Exchangeへようこそ。「この分野での研究が多すぎる」ということで、1行のコメントだけでなく、適切な「非回答」を書いてコミュニティに貢献するのに時間がかかると確信しています。このページには、「別の回答を追加」という小さなボタンがあります。それを見つけるには少し調査が必要かもしれませんが、それはそこにあります。
ステファンホッケンハル

うわー、パッシブアグレッシブ。私がもっとよく知っているとは言わなかった。私は、「ただ何でもする」だけでなく、人間の脳と死について正接することではなく、この問題に対処しようとしている研究がたくさんあることを知っています。
Tara

2014年の「非回答」以外の新しい回答はまだ表示されず、1行で建設的で積極的ではないコメントが5年後に投稿されました。リアルタイムゲームエンジンに完全に適用できるすべての調査(これまでにゼロリンクを提供したものの、1行のコメントのみ)を受け入れ、それを適切な回答に要約するために時間をかけることを100%歓迎します。
ステファンホッケンハル

おかけさまで元気です。私はすでに質問に反対票を投じ、なぜそうしたのかを説明するために最初のコメントを追加しました。
Tara
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.