鏡面ハイライトを実装してみました。問題は、サーフェスから遠くに移動すると、ハイライトがどんどん強くなり、ハイライトのエッジが非常に粗くなることです。表面に近づきすぎると、ハイライトが完全に消えます。
これは私のフラグメント シェーダーの関連部分です。すべての計算はビュー空間にあります。指向性太陽光を使用しています。
// samplers
vec3 normal = texture2D(normals, coord).xyz;
vec3 position = texture2D(positions, coord).xyz;
float shininess = texture2D(speculars, coord).x;
// normalize directional light source
vec3 source;
if(directional) source = position + normalize(light);
else source = light;
// reflection
float specular = 0;
vec3 lookat = vec3(0, 0, 1);
float reflection = max(0, dot(reflect(position, normal), lookat));
int power = 5;
specular = shininess * pow(reflection, power);
// ...
// output
image = color * attenuation * intensity * (fraction + specular);
これは私の照明バッファのスクリーンショットです。一番前のバレルにはスペキュラー ハイライトがまったくなく、遠くにあるバレルは非常に強く輝いていることがわかります。真ん中のバレルは思い通りに点灯。
私は何を間違っていますか?