1

シナリオは次のとおりです。cudaBindTextureToArrayによって3DOpenGLテクスチャをCUDAに渡し、非剛体変換で変換して3Dサーフェスに書き込み、ボリュームレンダリングのためにテクスチャでGLSLシェーダーに渡します。GLSLはテクスチャIDしか知りませんか?この3Dサーフェスを通常のOpenGLテクスチャとしてどのように使用しますか?

擬似コード

このようなopenglでテクスチャを作成します

glTexImage3D(GL_TEXTURE_3D, 0,............);

それをcudaに渡す

サーフェスを作成して塗りつぶします

cutilSafeCall(cudaBindSurfaceToArray(volumeTexOut, outTexture->content));
......
..
  cutilSafeCall( cudaMalloc3DArray(&vol->content, &vol->channelDesc, dataSize,  cudaArraySurfaceLoadStore ) );

変換後、..

  surf3Dwrite(short(voxel), volumeTexOut, sizeof(short)*x1,y1, z1);

そして今、私はこのサーフェスをopenglテクスチャとして使用し、それをGLSLに渡したいと思います

4

1 に答える 1

4

更新:以下に提案されているAPIはかなり古く、非推奨になっています。CUDA用の現在のGraphicsInteropAPIをご覧ください

CUDA OpenGL相互運用機能は(残念ながら)一方向APIです。CUDAとOpenGLの間で相互運用するには、OpenGLを使用してGLコードに必要なすべてのメモリを割り当て、CUDAでアクセスするためにCUDA配列またはデバイスポインターにバインドする必要があります。逆のことはできません(CUDAでメモリを割り当て、OpenGLからアクセスします)。これは、CUDAによって読み取りまたは書き込みされるデータに当てはまります。

したがって、出力には、ではなくOpenGLで3Dテクスチャを割り当てる必要がありますcudaMalloc3DArray()。次に、を使用して呼び出しcudaGraphicsGLRegisterImagecudaGraphicsRegisterFlagsSurfaceLoadStore次にを使用して結果の配列にサーフェスをバインドしcudaBindSurfaceToArrayます。これについては、CUDA 4.2CUDACプログラミングガイドのセクション3.2.11.1で説明されています。CUDAリファレンスガイドは、私が言及した機能に関する完全なドキュメントを提供します。

サーフェス書き込みには、2.0以上のGPUの計算機能が必要であることに注意してください。

于 2012-08-31T02:46:23.570 に答える