ray tracer中非同类型光源使用Taichi内置container存储问题

可能是一个很简单的问题。但我是Taichi新手,不是特别知道应该如何进行优雅的设计,所以在此求助各位大佬。问题如下:已知复杂的ray tracer应当有能力在场景中同时存在多个光源时进行tracing,但多个光源意味着可能存在不同类型的光源。不同类型的光源将需要存储不同的信息,比如点光源一般就只需要存位置,而面光源一般需要存储位置与其形状信息,这些信息将可以在光源的sample函数中使用(函数将需要在kernel函数中调用)。
那么,如何设计光源在Taichi中的存储方式?如果每个光源都是不同的struct,是否意味着对每种光源,都需要设置对应的field(太不优雅了)?是否有类似C++中“存有 指向基类的指针 的vector“这样的结构,来帮助统一不同类型光源在Taichi中的存储?或者说,是否有其他更好的设计方法呢?

2 个赞

确实可以用同一个结构体来表示所有的光源,代价是要多存一些信息,比如这样:

@ti.dataclass
class LightSource:
    type: int   #   0,1,2 for point, parallel, plane lights, etc
    position: vec3

    @ti.func
    def  sample(self):
         ...