ライティング シェーダーを少しスタイル化する作業を行っていたのですが、問題が発生しました。私のメインの開発用コンピューターには ATI カードがあり、新しいライティング シーンを問題なくレンダリングします。ただし、NVIDIA カードは、ゆがみや破れが見られる傾向があります。それはほとんどzbufferの問題のように見えますが、問題が何であるかについては完全にわかりません。ここでスクリーンショットを撮りました: http://i.imgur.com/CT5ymGH.png (顔の「ディザリング」に注意してください)
フラグメント プログラムの関連セクションは次のとおりです。
in vec3 vertex_color;
in vec4 vertex_position;
out vec4 fragment_color;
uniform vec3 playerPosition;
void main(void)
{
float playerDistanceTorch = length(playerPosition - floor(vertex_position.xyz));
float playerTorch = (160 - playerDistanceTorch * playerDistanceTorch);
fragment_color = vec4(vertex_color, 1) * clamp(playerTorch * 0.005, 0, 1);
}
繰り返しますが、これはこれまでのテストで NVIDIA カードにのみ影響しているように見えるので、かなり混乱しています。私の最初の推測は浮動小数点の精度エラーだったので、playerTorch をできるだけ長く維持しようとしました (元のコードは 0.8 - 0.005*playerDistanceTorch*playerDistanceTorch でした)。
編集:いくつかの実験を通じて、問題は vertex_position の線形補間に起因することがわかりました。この値を「フラット」にすると (補間が発生しないように)、テアリングがなくなります。ただし、これでは目的の効果が得られません。