今天我搞定了一个新技术
可以直接在C++里面写类似RSL的shader了
我简要介绍一下这个新技术,我还在考虑是否要在我们的项目中应用
这个技术的优势是可以借助现有的C++编译器,将shader直接编译成机器码执行,这样对于raytracing的效率很高,而且提供像RSL一样友好的编程接口
我用了一些比较邪门的tricks,现在可以直接用C++写类似RSL的shader,但是和RSL还有一定差距,shader写出来类似这样:
SHADER( phong, surface phong ( float a, float b, vector c, vector output d ) )
surface phong ( float a, float b, vector c, vector output d )
{
Ci = 0;
c = 1 + vector( 1, 2, 3 ) + vector( 1, 2, 3 ) + 3;
float dot = c & c;
d = vector( 5, 6, 7 );
illuminance_all( "catergory", point(1,2,3) )
{
}
illuminance( "catergory", point(1,2,3), vector(4,5,6), PI/2 )
{
}
}
END_SHADER( phong )
这里例子里面,和RSL相比,就是头尾需要多两行
SHADER( phong, surface phong ( float a, float b, vector c, vector output d ) )
END_SHADER( phong )
中间部分几乎一样,差别就是点乘不允许用RSL的.而必须使用&,另外,vector构造的时候不能指定space,而且output关键字只能写在类型的后面而不是前面,还有illuminance的两种形式不允许重载,其中一种必须写成illuminance_all
我想这点差别还是可以接受的吧?
至于vector构造的时候不能指定space的问题,可以用类的模板成员函数解决,只是写的时候,不能像RSL一样写:
vector "space" (x,y,z)
而必须写成:
vector_<space>(x,y,z)
这就要求我们稍微修改一下规范,但是大体还是很像RSL的吧,你们觉得是否应该在项目中应用,还是我们要按照RSL的传统做,弄编译器和虚拟机?