OptiX Prime 的使用(Python/C++)

許友綸
4 min readApr 5, 2019

最近NVidia RTX顯卡很紅,我想原本的OptiX光跡追蹤引擎應該也因此被加速了不少。其中OptiX Prime是他的Low-level API,拿來讓你做triangle hit test

最近要實作論文就把OptiX Prime弄了個Python binding出來。為什麼是python?其實有在搞Graphics的人都知道:每次要寫ABCDEFG part你才看得到畫面,然而你只想寫C part,這實在浪費很多時間。所以我選擇用python來整合Library。

因為自動產生binding的code目前手動還是有點多。之後有空我會弄好程式碼給大家安裝使用。

其實prime是一個很簡單的library,有幾個大觀念各位需要知道:

  1. Context:就是你知道的Context,可以選擇要CUDA/CPU運算
  2. BufferDesc:用來描述Buffer (長度/Stride/是GPU記憶體?)
  3. Model:模型。通常由vertices跟indices組成(他可以讓你選)
  4. Query:模型對一個批次的Ray做Hit Test,結果會存在Hit Buffer

我寫的pyoptixprime用起來基本上跟C++ API沒啥兩樣,完全沒高階封裝,不用擔心要學兩套。

大概只要import這些就行了,不過pytorch或cupy都可以用(如果你想要最純粹的GPU加速)

import pyoptixprime as prime
import numpy as np
#import torch
#import cupy as cp
ctx = prime.Context(prime.RTP_CONTEXT_TYPE_CUDA)

這裡講比較複雜的BufferDesc,以建立Ray跟Hit為例子,然後再送去Query查詢,Query結束之後,答案會存在hits裡面,可以繼續用numpy操作

可以看到BufferDesc用來描述自己指向的那個緩衝區的格式。對於Ray的origin/Dir大家應該沒什麼意見,但Hits只支援t跟三角形ID就說不過去了。當然這不可能!以下是支援的Format,基本上T_TRIID_U_V就很夠用了。

Supported hit format

關於怎麼上傳Model也不是太困難

#請自行準備好verts_desc indices_desc
mdl = ctx.createModel()
# setTriangles2用來上傳 vertices/indices
mdl.setTriangles2(verts_desc, indices_desc)
# 好了之後記得上傳模型
# 這個操作可以讓你ASYNC(其實Query也可以)
mdl.update(prime.RTP_MODEL_HINT_ASYNC)
# 確定上傳完畢可以呼叫finish
mdl.finish()

至於怎麼傳CUDA Memory Pointer,你可以用Cupy或是Pytorch建立Tensor/array,然後用我提供的createBufferDesc2,這專門讓你傳指標

ctx.createBufferDesc2(????, prime.RTP_BUFFER_TYPE_CUDA_LINEAR,    torch_tensor.data_ptr())

放個圖以免大家以為這是假想的library。(對!你正在看一個還沒發布的library的說明書)

最後提供一個Code,示範如何整合tinyobjloader跟optix prime

--

--