私はシャドウマッピングを実装しているWebGLプログラムで作業しています。各フラグメントの深さ値を計算した後、最後にフラグメントが影にあるかどうかに基づいて照明を計算するif文があります。 depth
は、シャドウマップの深さで、light_tex_coord
がlight1
のシーン空間のフラグメントの位置であるWebGLフラグメントシェーダがif文で正しく分岐しない
gl_FragColor = vec4(calcLighting(light0, eye_dir, eye_dir_norm, normal), 1);
if (light_tex_coord.z - depth <= 0.0) {
gl_FragColor += vec4
(calcLighting(light1, eye_dir, eye_dir_norm, normal)
, 0.0
);
}
。 light1
はモデルの周りを回転する点光源、light0
はカメラに静的に配置された点光源です。
ここで問題となるのは、ifブランチが決して撮影されないため、シーンにはlight0
しか適用されないということです。 depth
、light_tex_coord
、およびcalculateLighting
が正しく動作することを確認しました。正しく、赤、緑で描画される影なしで描画される領域を陰に
if (light_tex_coord.z - depth <= 0.0) {
gl_FragColor = vec4(0,1,0,1);
} else {
gl_FragColor = vec4(1,0,0,1);
}
原因:ここでは
は、次のコードで上記の交換、しかし、奇妙なことです。つまり、ブランチは正しく評価されます。これでそれを置き換える:
gl_FragColor = vec4(calcLighting(light0, eye_dir, eye_dir_norm, normal), 1);
gl_FragColor += vec4
(calcLighting(light1, eye_dir, eye_dir_norm, normal)
, 0.0
);
は照明が正常に(ただし、サンセリフの影)を計算するようにします。 if文でより高価なcalcLighting関数を呼び出すと、それを取ることが気にならないようです。
さらに、私はclamp
関数を使用することを含むいくつかの方法で照明を適用しようとしました。常に追加を行い、第2のcalcLighting
呼び出しを1または0で乗算するための象限演算子を使用し、if文をさまざまな方法で配置します。何も動作していないようです。
webglでの分岐がどのように機能しているのか分かりませんか?
別の 'vec4'変数に色を累積しようとしましたか?**これだけ他の変数の値を' gl_FragColor'に割り当てます**。シェーダの 'gl_FragColor'への複数回の書き込みは、その値を読み込む(これは' + = 'を実装するために必要です)サポートされているはずですが、すべてのアカウントでこの問題がこれらのアクションの1つまたは両方に関連しているようですあなたのコントロールフローを与えます。 –
私は、上記のスニペットの 'gl_FragColor'のすべてのインスタンスをアキュムレータ' vec4 acc; 'で置き換えようとしました。私は 'gl_FragColor = acc;'でシェーダの最後にのみ割り当てました。上記のいずれの場合にも変更はありません。 – Cookyt
fsコード全体を提供できますか? また、コードを 'gl_FragColor + = vec4(calcLight(..)、1.0)'に変更しても何か違いはありますか? [note 1.0 alpha value] –