DirectXでのレイトレーシングにいくつかの問題があり、特にスペキュラに関する深刻なバンディングの問題があります。高い鏡面反射力(8以上)でバンディングが始まります。これがHDR / LDRの問題なのか、それとも法線や他のベクトルなど、他の何かに関連している可能性があるのでしょうか。
更新
更新については以下をご覧ください。
これは、球体上のブリンフォンに関連するシェーダーコードです。
float3 hitPoint = thisRay.origin + thisRay.direction * bestHit.hitT;
float3 normal = normalize(hitPoint - spheres[bestHit.hitID].center);
float3 toLight = pointLights[0].position.xyz - hitPoint;
float d = length(toLight);
toLight = normalize(toLight);
float diffuse = max(dot(normal, toLight), 0.0f);
float3 v = normalize(thisRay.origin - hitPoint);
float3 h = normalize(v + toLight);
float spec = 0;
if (diffuse > 0)
spec = pow(max(dot(normal, h), 0.0f), specPower) * diffuse;
output[threadID.xy] = spheres[bestHit.hitID].colour * diffuse + spheres[bestHit.hitID].specColour * spec;
この画像では、specPowerは8です。
この画像では、specPowerは9です。
これは、HDR / LDRの問題と同じくらい簡単ですか、それとも通常の精度に関連していますか?法線が低精度で不適切にパック/アンパックされた遅延レンダラーでこの問題が以前に発生したと思いますが、この場合、法線はオンザフライで生成され、すべてが直接バックバッファーにレンダリングされます。
アップデート1
上記に加えて、三角形には同じアーティファクトがあり、それらの法線は現在次のように生成されていることを追加したいと思います。
float3 normal = normalize(cross(triangles[bestHit.hitID].vertices[1] - triangles[bestHit.hitID].vertices[0],
triangles[bestHit.hitID].vertices[2] - triangles[bestHit.hitID].vertices[0]));
これにより、表面の法線が問題である可能性はさらに低くなります。次の画像は、specPowerが2048に達するとどうなるかを示しています。
spec
直接出力してみてくださいmax(dot(normal, h), 0.0f)
。どちらの計算でも、この戻り値が1の値を探します。
float3 h = normalize( reflect(toLight,normal) );
。そしてspec = pow(dot(v, h) * 0.5 + 0.5, specPower) * diffuse;