Instant Neural Graphics Primitives with a Multiresolution Hash Encoding
Steps
- Setup WSL2 with CUDA support
- Install CUDA Toolkits via conda
conda create -n instant-ngp
conda activate instant-ngp
conda install -c nvidia cuda-tools cuda-toolkit
conda install -c conda-forge cmake
export PATH="$CONDA_PREFIX/bin:$PATH"
export LD_LIBRARY_PATH="$CONDA_PREFIX/lib:$LD_LIBRARY_PATH"
- Install other dependencies via apt
sudo apt-get install build-essential git python3-dev python3-pip libopenexr-dev libxi-dev \
libglfw3-dev libglew-dev libomp-dev libxinerama-dev libxcursor-dev
- Clone the repo from Github
git clone --recursive https://github.com/nvlabs/instant-ngp
cd instant-ngp
- Modify the source code to fix the SegmentationError
GLTexture::CUDAMapping::CUDAMapping(GLuint texture_id, const Vector2i& size) : m_size{size} {
// static bool s_is_cuda_interop_supported = true;
static bool s_is_cuda_interop_supported = false;
if (s_is_cuda_interop_supported) {
cudaError_t err = cudaGraphicsGLRegisterImage(&m_graphics_resource, texture_id, GL_TEXTURE_2D, cudaGraphicsRegisterFlagsSurfaceLoadStore);
if (err != cudaSuccess) {
s_is_cuda_interop_supported = false;
cudaGetLastError(); // Reset error
}
}
if (!s_is_cuda_interop_supported) {
// falling back to a regular cuda surface + CPU copy of data
m_cuda_surface = std::make_unique<CudaSurface2D>();
m_cuda_surface->resize(size);
m_data_cpu.resize(m_size.prod() * 4);
return;
}
CUDA_CHECK_THROW(cudaGraphicsMapResources(1, &m_graphics_resource));
CUDA_CHECK_THROW(cudaGraphicsSubResourceGetMappedArray(&m_mapped_array, m_graphics_resource, 0, 0));
struct cudaResourceDesc resource_desc;
memset(&resource_desc, 0, sizeof(resource_desc));
resource_desc.resType = cudaResourceTypeArray;
resource_desc.res.array.array = m_mapped_array;
CUDA_CHECK_THROW(cudaCreateSurfaceObject(&m_surface, &resource_desc));
}
- Build
cmake . -B build
cmake --build build --config RelWithDebInfo -j 16
- Run
./build/testbed --scene data/nerf/fox