最近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,有幾個大觀念各位需要知道:
- Context:就是你知道的Context,可以選擇要CUDA/CPU運算
- BufferDesc:用來描述Buffer (長度/Stride/是GPU記憶體?)
- Model:模型。通常由vertices跟indices組成(他可以讓你選)
- 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就很夠用了。
關於怎麼上傳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