OpenSubdiv.OPENSUBDIV_VERSION.Bfr
OpenSubdiv.OPENSUBDIV_VERSION.Far
OpenSubdiv.OPENSUBDIV_VERSION.Osd
OpenSubdiv.OPENSUBDIV_VERSION.Sdc
OpenSubdiv.OPENSUBDIV_VERSION.Vtr

OpenSubdiv.OPENSUBDIV_VERSION.Osd.CudaVertexBuffer

简介

OpenSubdiv.OPENSUBDIV_VERSION.Osd.CudaVertexBuffer是OpenSubdiv库中用于在CUDA上实现VertexBuffer的类。

使用方法

初始化

  • CudaVertexBuffer(int numElements, int numVertices, void *devicePtr = NULL)
    • 构造函数,初始化一个CudaVertexBuffer对象,numElements表示每个顶点存储的元素数,numVertices表示顶点数量,devicePtr指向已分配CUDA device memory的指针,如果为NULL,则分配一个新的device memory。
  • virtual cudaError_t Allocate(void *devicePtr = NULL)
    • 分配device memory。如果devicePtr为NULL,则会分配一个新的device memory。如果devicePtr非空,则会在此位置分配device memory,并且numVertices和numElements必须匹配,并且devicePtr必须是一个已分配的device memory。

访问数据

  • virtual float* BindCudaBuffer()
    • 绑定device memory到CUDA context,并返回device memory的指针。
  • virtual void UnbindCudaBuffer()
    • 解除device memory与CUDA context的绑定。
  • virtual void CopyFromHost(const float *src, int numVertices)
    • 将host memory中的数据复制到device memory中。
  • virtual void CopyToHost(float *dst, int numVertices) const
    • 将device memory中的数据复制到host memory中。

销毁

  • virtual cudaError_t Release()
    • 释放device memory。如果对象是构造时分配的,则将释放这个内存,否则这个函数不做任何操作。

示例

#include <opensubdiv/osd/cudaVertexBuffer.h>

const int kNumVertices = 1024;
const int kNumElements = 4; // 每个顶点有4个元素

int main()
{
    // 创建一个CudaVertexBuffer对象
    OpenSubdiv::Osd::CudaVertexBuffer vertexBuffer(kNumElements, kNumVertices);

    // 分配device memory
    vertexBuffer.Allocate();

    // 绑定device memory
    float *devicePtr = vertexBuffer.BindCudaBuffer();

    // 将数据复制到device memory
    float data[kNumVertices * kNumElements];
    for (int i = 0; i < kNumVertices * kNumElements; ++i)
        data[i] = i;
    vertexBuffer.CopyFromHost(data, kNumVertices);

    // 解除绑定
    vertexBuffer.UnbindCudaBuffer();

    // 使用vertexBuffer...

    // 删除vertexBuffer并释放device memory
    vertexBuffer.Release();
    return 0;
}

参考文献