簡體   English   中英

有沒有辦法將在 CUDA 中創建的 3d 表面合並到 OpenGL 紋理?

[英]is there any way to bin an 3d surface created in CUDA to an OpenGL texture?

這是場景:我通過 cudaBindTextureToArray 將 3D OpenGL 紋理傳遞給 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

更新:下面建議的 API 已經很舊了,已被棄用。 請參閱當前的 CUDA 圖形互操作 API

CUDA OpenGL 互操作(不幸的是)是一種單向 API:要在 CUDA 和 OpenGL 之間進行互操作,您必須使用 OpenGL 分配 GL 代碼中所需的所有內存,然后將其綁定到 CUDA 數組或設備指針,以便在 CUDA 中訪問它。 你不能做相反的事情(用 CUDA 分配內存並從 OpenGL 訪問它)。 這適用於由 CUDA 讀取或寫入的數據。

因此,對於您的輸出,您希望在 OpenGL 中分配 3D 紋理,而不是使用cudaMalloc3DArray() 然后,您想使用cudaGraphicsRegisterFlagsSurfaceLoadStore調用cudaGraphicsGLRegisterImage ,然后使用cudaBindSurfaceToArray將表面綁定到結果數組。 CUDA 4.2 CUDA C 編程指南的第 3.2.11.1 節對此進行了討論。 CUDA 參考指南提供了有關我提到的功能的完整文檔。

請注意,表面寫入需要計算能力 2.0 或更高的 GPU。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM