可以直接在C++里面写类似RSL的shader了

今天我搞定了一个新技术

可以直接在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的传统做,弄编译器和虚拟机?

原文地址:https://www.cnblogs.com/len3d/p/908428.html