4

カーネル サイズ 64 の SSAO シェーダーを実行しています。

SSAO フラグメント シェーダー:

const int kernelSize = 64;
for (int i = 0; i < kernelSize; i++) {
        //Get sample position
        vec3 s = tbn * ubo.kernel[i].xyz;
        s = s * radius + origin;
        vec4 offset = vec4(s, 1.0);
        offset = ubo.projection * offset;
        offset.xy /= offset.w;
        offset.xy = offset.xy * 0.5 + 0.5;
        float sampleDepth = texture(samplerposition, offset.xy).z;
        float rangeCheck = abs(origin.z - sampleDepth) < radius ? 1.0 : 0.0;
        occlusion += (sampleDepth >= s.z ? 1.0 : 0.0) * rangeCheck;
    }

samplerposition テクスチャには の形式VK_FORMAT_R16G16B16A16_SFLOATがあり、フラグを付けてアップロードされVK_MEMORY_PROPERTY_DEVICE_LOCAL_BITます。

nvidia K1100Mグラフィックカードを搭載したラップトップを使用しています。コードを renderdoc で実行すると、このシェーダーには114 ミリ秒かかります。を 1に変更すると、 1 mskernelSizeかかります。

このテクスチャのフェッチ時間は正常ですか? それとも、どこかで何か間違った設定をしている可能性がありますか?

レイアウト遷移がうまくいかなかったようで、VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL代わりにテクスチャが入っていVK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMALます。

4

2 に答える 2

4

GPU メモリはキャッシュの大量使用に依存しています。これは、互いに近いフラグメントが互いに隣接するテクセルをサンプリングしない場合 (空間的一貫性の欠如とも呼ばれます)、非常に制限されます。テクスチャへのランダム アクセスと線形のコヒーレント アクセスでは、約 10 倍以上の速度低下が予想されます。大きな半径で SSAO を使用すると、この問題が発生しやすくなります。

小さい半径を使用し、テクスチャ アクセスを最適化することをお勧めします。4 つの 16 ビット float をサンプリングしていますが、使用しているのは 1 つだけです。深度を別の 16 ビット深度のみのイメージにブリッティングすると、簡単に 4 倍のスピードアップが得られます。

于 2016-08-15T12:47:50.297 に答える