一直以来都想做一个脚本驱动的渲染器.就是说可以用脚本定制渲染器的行为,比如创建多少个渲染队列,如何渲染.多少RenderTarget, 每个物体的材质也是一样. 要生成多少个Pass,每个Pass是立即渲染呢还是放到那个队列里 .
其实我是个很懒的人 ,这个想法早在去年就有了.一直拖到现在,昨天晚上实在受不了自己的懒惰了.也受点老宋一些刺激,顺手就抓了个AngelScript.把它集成到 渲染器里了.一个简单的渲染脚本类似如下
int queueNormal;
int queueTranslucy;
int queueGlow;
int texScreen;
int quadShader;
int colorMorphShader;
int rt;
int x , y ;
int x2 , y2;
int dx , dy;
int dx2 , dy2;
void StartRenderer()
{
x = 0;
y = 0;
dx = 1;
dy = 2;
x2 = 10;
y2 = 40;
dx2 = 2;
dy2 = 1;
queueNormal = createQueue("Normal");
queueTranslucy = createQueue("Translucy");
queueGlow = createQueue("Glow");
texScreen = load2DTexture("default","videoTexture.mpeg");
quadShader = loadShader("Simple.shader");
colorMorphShader = loadShader("SimpleColorMorph.shader");
rt = createRenderTexture("RT",1024,1024,1);
}
void StopRenderer()
{
clearRenderContex();
}
void Render(float passedTime)
{
x += dx;
y += dy;
if(x < 0 || x > 600) dx =-dx;
if(y < 0 || y > 400) dy =-dy;
x2 += dx2;
y2 += dy2;
if(x2 < 0 || x2 > 600) dx2 =-dx2;
if(y2 < 0 || y2 > 400) dy2 =-dy2;
renderQueue(queueNormal);
pushRenderTexture(rt,0);
clearScene(1.0f,0.0f,0.0f,1.0f,1,0);
renderQueue(queueNormal);
popRenderTexture();
enter2DMode();
pushShader(quadShader);
draw2DTextureRect(rt,x,y,500,400,1.0,1.0,1.0,1.0);
popShader();
pushShader(colorMorphShader);
draw2DTextureRect(texScreen,x2,y2,400,300,1.0,1.0,1.0,1.0);
popShader();
leave2DMode();
}
AngelScript是C语法的. 可以方便的把脚本稍加转化编译进程序里,或者做成dll插件的形式,在发布程序的时候能保证最大的效率.非常的不错.
以上这个脚本能在正常绘制一个普通渲染队列以外,额外的绘制两个矩形. 脚本能控制渲染器多少的行为完全看你给脚本暴露了多少的接口.