0

opengl4.3シェーダーのスペキュラーパワーコンポーネントの変更に問題があります。鏡面反射光は、0〜10の光沢値を使用すると正常に機能しますが、値を大きくしてマテリアルをより光沢にするようにすると、照明の強度が低下します。これが私のコードです:

    //Direct Lighting
vec3 L = normalize(worldPos.xyz - lightPos.xyz);
vec3 D = normalize(lightDir.xyz);
float dist = length(-L);
float I = max(dot(N.xyz, -L), 0.0);

vec3 h = normalize(-L.xyz + E);
float specLighting = 0.0;
specLighting = pow(max(dot(N.xyz, h), 0.0),50.0);

fColor.xyz = vec3(specLighting);

したがって、光沢値を50程度に増やすと、照明はまったくなくなります。ちなみに、このコードでは、問題をデバッグするために鏡面反射光のみを表示しています。

[編集]説明に詳細が不足しているため、鏡面反射光の値を1から7に変更した結果のスクリーンショットをいくつか添付しました。ご覧のとおり、鏡面ハイライトのサイズが小さくなっています(これが私が望むものです)。 )、照明もフェードします(これは私が望むものではありません)。約10秒で真っ黒になります。

ちなみに、私はこれを完全にピクセル/フラグメントシェーダーで行っています。

また、directx 11テストエンジンのスクリーンショットを追加しました。鏡面照明とまったく同じコードを使用していますが、光沢係数は100です。

specLighting = pow(max(dot(N.xyz、h)、0.0)、1.0);

specLighting = pow(max(dot(N.xyz、h)、0.0)、2.0);

specLighting = pow(max(dot(N.xyz、h)、0.0)、3.0);

specLighting = pow(max(dot(N.xyz、h)、0.0)、5.0);

specLighting = pow(max(dot(N.xyz、h)、0.0)、7.0);

DirectX11スペキュラーハイライト

Directx 11:

4

4 に答える 4

3

最小限の照明ベースのイルミネーションを維持したい場合は、非鏡面コンポーネントを追加する必要があります。スペキュラ コンポーネントは通常、唯一の要素としてではなく、マテリアルにハイライトを追加するために使用されます。

とにかく、あなたが報告する暗くなるのは、指数を増やすことの自然な結果です. 考えてみてください: ベクトルは事前に正規化されているため、dot(N.xyz, h)1.0. 0 から 1 の間の数値を高いべき乗にすると、自然に結果が非常に短時間で非常に小さくなる傾向があります。これはまさに、シャープなスペキュラー ハイライトに必要なものです!

もちろん、ハイライトのサイズを小さくすると、平均鏡面反射が減少します (もちろん、最大鏡面反射値をもっと明るくしない限り...)。しかし、鏡面反射だけを持つ実際のオブジェクトはほとんどありません。また、オブジェクトに鏡面反射のみがある場合鏡面スポットを除いて非常に暗く見えます。


別の見方をすると、式は、最大値が である鏡面輝度を与えます1.0(これは、各カラー チャネルが で最大になる従来の低ダイナミック レンジのコンピュータ グラフィックスでは、いくつかの点で実用的に便利です1.0)。ただし、現実の世界では、より光沢のあるサーフェスは通常、スペキュラー ハイライトを明るくするだけでなく小さくするため、スペキュラーの平均輝度は同じままです。状況を混乱させるのは、これらとケースとの対比です。実用的な目的では、式は「設計どおりに機能しています -- 修正されません」。通常、アーティストは、希望する外観が得られるまで、スペキュラー指数と明るさを調整するだけです。

于 2013-02-15T19:47:06.730 に答える
0

質問が十分な情報で更新される前に、私はもともとこの回答を書きました。したがって、この場合は明らかに正しい答えではありませんが、同様の問題を抱えている人に当てはまる可能性があります...

スペキュラーライティングがパワーの増加に伴って強度が低下する理由について考えられる1つの説明は、ピクセルごとではなく頂点レベルでスペキュラーライティングを計算している場合です。ハイライトポイントが頂点ではなくポリゴンの中央にある場合、光沢が増すにつれてサイズが小さくなると、頂点の寄与が急速に低下し、ハイライトが消えます。本当に良い鏡面反射(そして本当に良い照明)の場合、ピクセルごとに計算し、位置や法線など、ポリゴン全体で実際にスムーズに変化するものだけを補間する必要があります。

于 2013-02-16T01:01:57.820 に答える
0

助けてくれてありがとう

これは、頂点シェーダーのばかげた間違いであることが判明しました。

それ以外の:

    fNorm = vec4(mat3(worldSpace)*vNorm.xyz,0);

私はちょうど持っていました:

fNorm = vNorm;
于 2013-02-16T03:08:17.753 に答える
-2

「光沢」を上げると、マテリアルの光沢が低下します。

于 2013-02-15T16:54:58.777 に答える