从OptiX内核写入CUDA曲面

从OptiX内核写入CUDA曲面,cuda,textures,optix,Cuda,Textures,Optix,我在玩新的OptiX-7版本。为了显示启动结果(由raygen编写的简单单色),我创建了一个OpenGL纹理,映射它并通过CUGraphicsSubResourceGetMappedaray获得映射数组,最后创建了一个以数组为背景的CUDA曲面。但是,从OptiX内核写入曲面既不会改变(显示的)纹理,也不会产生错误,而几乎相同的常规CUDA内核具有明显的效果 CUDA代码: __global__ void test_kernel(::CUsurfObject surface) { con

我在玩新的OptiX-7版本。为了显示启动结果(由raygen编写的简单单色),我创建了一个OpenGL纹理,映射它并通过CUGraphicsSubResourceGetMappedaray获得映射数组,最后创建了一个以数组为背景的CUDA曲面。但是,从OptiX内核写入曲面既不会改变(显示的)纹理,也不会产生错误,而几乎相同的常规CUDA内核具有明显的效果

CUDA代码:

__global__ void test_kernel(::CUsurfObject surface) {
    const uint2 imageIndex{
        threadIdx.x + blockDim.x * blockIdx.x,
        threadIdx.y + blockDim.y * blockIdx.y
    };
    if(imageIndex.x < 800 && imageIndex.y < 100)
        ::surf2Dwrite(::make_float4(1.f, 0.f, 1.f, 1.f), surface,
                      imageIndex.x * sizeof(float4), imageIndex.y);
}
曲面控制柄通过启动参数传递:

cuMemAlloc(&devParamBuf, sizeof(Params));
cuMemcpyHtoD(devParamBuf, &hostParamBuf);
...
optixLaunch(pipeline, stream, devParamBuf, sizeof(Params), &sbt, 800, 600, 1);
内核本身执行得很好。OptiX示例包含一个纹理显示示例,只需使用CuDateTextureObject。但是,它们也使用普通缓冲区和PBO来显示渲染图像。直接写入CUDA表面是不可能的吗

编辑:要澄清曲面的创建方式,请执行以下操作: 以现有的OpenGL纹理为例,我用

GLuint纹理{};
glGenTextures(…);
...
cuGraphicsGLRegisterImage(资源、纹理、GL_纹理、2D、CU_图形、寄存器、标志、表面);
CUS资源(1u和资源、流);
CUarray{};
CUGraphicsSubreSourceGetMappedaray(&surfaceArray,资源,0u,0u);
CUsurfObject曲面{};
CUDA_资源描述surfDesc{};
surfDesc.resType=CU\u资源类型\u数组;
surfDesc.res.array.hArray=表面阵列;
cuSurfObjectCreate(&surface,&surfDesc);

为简洁起见,所有调用都被包装,并省略了错误检查。

我可能正在使用directx12执行此操作。如果进行映射,则不应存在任何*alloc.,而应正确填充一个
cudaResourceDesc
,以便在映射数组和
cudaCreateSurfaceObject
之间进行映射。因此,实际上您正在更改一个与GL纹理无关的曲面,从而得到结果。但我也不确定CUGraphicsSubreSourceGetMappedaray是否正确。更多的代码会很有帮助。我添加了更多关于如何创建曲面的代码。我尝试在使用曲面之前取消映射资源,以及在渲染完成之前保持映射。Tbh这并不是一个紧迫的问题-我要求对帧缓冲区进行原子操作,但AFAIK表面并没有提供;我用D3D12做到了这一点,它可能与GL相同:感谢链接。不幸的是,这不是答案。映射曲面已经可以使用普通CUDA。只有在OptiX启动时,写入才会变得不可见。我还检查了生成的PTX,除了获取线程和启动索引的差异外,表面存储完全相同,但似乎无法从OptiX raygen程序执行。
cuMemAlloc(&devParamBuf, sizeof(Params));
cuMemcpyHtoD(devParamBuf, &hostParamBuf);
...
optixLaunch(pipeline, stream, devParamBuf, sizeof(Params), &sbt, 800, 600, 1);