用shader制造火焰与爆炸

-------------------------西昌.何雨锋 用shader制造火焰与爆炸
shader文件可以用记事本打开,然后发现其内容大概是这样的:
Animations/Flames/flame1.jpg > Flame1
Animations/Flames/flame2.jpg > Flame2
Animations/Flames/flame3.jpg > Flame3
Animations/Flames/flame4.jpg > Flame4
Animations/Flames/flame5.jpg > Flame5
Animations/Flames/flame6.jpg > Flame6
Animations/Flames/flame7.jpg > Flame7
Animations/Flames/flame8.jpg > Flame8
//指出由哪些图片构成了第几贞第几贞,这些图片的位置及名称
SHADER Flame1
{...}
//指出了这个shader文件中装了一个叫flame1的动画,可以在程序中以此名调用
anim 10 Flame1 Flame2 Flame3 Flame4 Flame5 Flame6 Flame7 Flame8 [0]
//表明了动画长度及每幅画的名称
里面还有其他一些什么层的信息,不用管它。

下面说怎样调用一个火焰:如果你要建立多个不同的火焰,那就多建几个mesh,然后分别getshader就行了。
首先还是得用mesh
*********
ITVMesh mesh1;                 //火焰用mesh
mesh1=scene1->CreateMeshBuilder("fire");
scene1->LoadShaders("Animations//common.shader");
mesh1=scene1->CreateBillboard(0,2000,land1->GetHeight(2000,2000),2000,128,256,"",tvfalse,(enum TrueVision3D::CONST_D3DBLEND) 0,(enum TrueVision3D::CONST_D3DBLEND) 0,RGBA(0.5,0.8,0.6,0.7),false);
mesh1->SetShader(global1->GetShader("FLAME1"),-1);
//最后在渲染中记得render就可以了.
*********
1、首先shader得用scene读到global中去。
2、mesh=scene建立出的一个画板。
3、mesh读出藏在这个shader中的名叫Flame1的动画。
4、shader文件放在哪里就要把路径写好,但是shader中的路径是从可执行文件出发的路径,而不是shader文件所在的路径,要注意。
5、在循环渲染中,shader的mesh渲染一定要放在land的渲染后,否则就会发现land的shader附近有大量的镂空出现。

***********
shader显示不出来,只显示了一块白板在天上最可能的情况是
1、shader在engine1->EnableShader(true/false); 可以设置为允许或不允许shader,选项没打开。
2、在设置scene1->LoadShaders("shader文件")时路径没以可执行文件为起点。
3、最可能的一点是scene1->RenderAllMeshes(tvfalse);  如果参数设置为true,则shader显示不出来。


***********
制作爆炸效果时,发现边上有一层矩形白边,特别是在雾中,这主要是由于灯光过强所引起的。
解决办法为:在两边都加光,或者光的最后一个强度参数改得很小,如0.02;

你可能感兴趣的:(TV3)