6

ボクセルベースのメッシュにアンビエント オクルージョンを実装し、面の端でこれらのちらつきのある白いピクセルを取得しようとしています。

きらめくピクセル

ここに私のフラグメントシェーダーがあります:

#version 120

varying vec4 color;
varying vec4 normal;

void main(void)
{
  float light = normal.w + max(0.15*dot(normal.xyz, vec3(1,1,1)), 0.0);
  gl_FragColor = vec4(color.xyz * light, 1.0);
}

lightからを削除するとgl_FragColor vec4、アーティファクトが消えます。このlight値は、アンビエント オクルージョン値 ( normal.w) とスペキュラ コンポーネントから計算されます。問題を引き起こしているのは鏡面反射光のようです。コーナーとエッジが突然このように点滅するのはなぜですか? メッシュが回転すると、白いピクセルがきらめくように見えます。しかし、より大きなサーフェスでは、スペキュラー ハイライトは通常のように見え、点滅するのではなく、光源に従います。

4

1 に答える 1

2

言及したところで、T ジャンクションを削除するための通常の解決策、つまり T ジャンクションに頂点を挿入する方法に従った場合、基本的に貪欲なメッシングの利点が取り消されます。これはすでにここで議論されているようですが、実際の解決策は提案されていません。どうやらそこには、ほとんどのハードウェアでこの問題が十分に反映されていないため、さらに調査する必要があるという議論があったようです。

あなたの場合、ポリゴン エッジの実際のラスタライズ (T ジャンクション エラー) 中に問題が発生するのではなく、頂点ごとの補間に依存するフラグメント シェーダーで値を計算しようとすると、ほとんど問題が発生しないようです。カラー バッファを赤にクリアしているようです。その場合、ラスタライズ中にこれらがサブピクセル T ジャンクション エラーである可能性はさらに低くなります。よく調べてみると、斜めの三角形のエッジに沿っていくつかの不連続性があることに気付きます (顔の半分で法線が反転しているように見えます)。おそらく、この問題は実際には入力頂点属性の大きな不一致に関連しています。最初に顔全体で滑らかな結果が得られるように照明を修正しようとしますが、それが原因で T ジャンクションの問題も発生している可能性があります。

実際、頂点シェーダーを質問に含めることは可能でしょうか? がどのようnormal.wに計算されるのか興味があります。


アップデート:

私はあなたのコードを OS X に移植しました (あなたが考えるより難しい:P)、同じ結果で:

OpenGL レンダラー文字列: NVIDIA GeForce GT 330M OpenGL エンジン
OpenGL バージョン文字列: 2.1 NVIDIA-1.6.36
OpenGL シェーディング言語のバージョン文字列: 1.20

OSX スクリーンショット

頂点シェーダーに次の変更を加えた後:

//ノーマル = v_ノーマル;
normal = vec4 (正規化 (v_normal.xyz), v_normal.w);

およびフラグメント シェーダー:

//float light = normal.w * max (0.15*dot(normal.xyz, vec3 (1,1,1)), 0.0);
float light = normal.w * max (1.5*dot(normal.xyz, vec3 (1,1,1)), 0.0);

キラキラが消え、これが結果です。

ここに画像の説明を入力

ただし、アンビエント オクルージョンの用語は、三角測量された顔の半分でまだ逆になっているようです。

于 2013-09-01T03:36:00.243 に答える