5

私がやろうとしているのは、OpenGL を使用してレンダリングを実行し、次に CUDA を使用して、データを PBO にコピーせずに、レンダリングされた RGB および深度コンポーネントで読み取り専用の後処理 (計算) を直接実行することです。

これを行うには、FBO を作成し、それに 2 つの RBO を接続します (1 つは RGBA 用、もう 1 つは DEPTH 用)。

次に、パラメータとして GL_RENDERBUFFER を使用して、RBO ごとに cudaGraphicsGLRegisterImage を呼び出します。カラー RBO の場合、cudaGraphicsGLRegisterImage は cudaSuccess を返しますが、深度 RBO の場合は cudaErrorInvalidValue を受け取ります。

フォーラムのどこかで、深度コンポーネントの CUDA レンダー バッファーの相互運用性が現在 nVidia でサポートされていないことを読みましたが、ドキュメントには十分に記載されています。

CUDA Toolkit 5.0 を使用しており、Quadro 2000 カードを持っています。

誰かがこれを行うことに成功しましたか?どのように?

ここにいくつかのコードの抜粋があります:

glGenRenderbuffers(1, &rbo_color);
glBindRenderbuffer(GL_RENDERBUFFER, rbo_color);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, WIDTH, HEIGHT);
glBindRenderbuffer(GL_RENDERBUFFER, 0);

if (cudaGraphicsGLRegisterImage(&resource_color, rbo_color, GL_RENDERBUFFER, cudaGraphicsMapFlagsReadOnly) != cudaSuccess)
    fprintf(stderr, "Error in registering rbo color with cuda\n");

glGenRenderbuffers(1, &rbo_depth);
glBindRenderbuffer(GL_RENDERBUFFER, rbo_depth);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT32F, WIDTH, HEIGHT);
glBindRenderbuffer(GL_RENDERBUFFER, 0);

if (cudaGraphicsGLRegisterImage(&resource_depth, rbo_depth, GL_RENDERBUFFER, cudaGraphicsMapFlagsReadOnly) != cudaSuccess)
    fprintf(stderr, "Error in registering rbo depth with cuda\n");
4

1 に答える 1

4

深度バッファ自体をバインドすることに成功しませんでした。これに対する 1 つの回避策は、深度ピクセル値をカラー バッファーにレンダリングし、そのカラー バッファーをバインドすることです。これを行うには、独自のシェーダーを作成する必要があります。

于 2013-02-01T08:33:47.537 に答える