10 Shaders
官方代码($sdk)\examples\10.Shaders
这个例子是在irr里使用DX和OpenGL的Shader,使用Shader创建新的材质类型。
同固定管线渲染一样,使用Shader也需要用到很多矩阵,但是这些矩阵信息不再是irr自动提供,而是通过继承IShaderConstantSetCallBack接口类提供矩阵信息给Shader。在该例中使用了一些简单的顶点Shader,它会根据摄像机的位置计算顶点的颜色。实现这功能,需要为Shader提供转换法线的逆世界矩阵、转换坐标的剪切矩阵、摄像机位置和物体在世界矩阵中的位置。这些数据将在自己继承的IShaderConstantSetCallBack接口类的OnSetConstanes()方法中使用。OnSetConstanes()会在每次设置材质的时候被调用。它的参数IMaterialRendererServices接口类的setVertexShaderConstant()方法用来设置Shader所需的数据。下面看如何继承IShaderConstantSetCallBack接口类。
classMyShaderCallBack : public video::IShaderConstantSetCallBack
{
public:
//参数services:指向一个接口,它提供设置Shader常量的方法
//参数userData:创建Shader时能指定用户数据
virtualvoid OnSetConstants(video::IMaterialRendererServices* services,
s32userData)
{
video::IVideoDriver*driver = services->getVideoDriver();
//设置逆向世界矩阵
//如果使用高级Shader(用户可以在程序开始时进行选择),在此必须设置其名
称。
core::matrix4invWorld = driver->getTransform(video::ETS_WORLD);
invWorld.makeInverse();
if(UseHighLevelShaders)
services->setVertexShaderConstant("mInvWorld",invWorld.pointer(), 16);
else
services->setVertexShaderConstant(invWorld.pointer(),0, 4);
//设置剪切矩阵
core::matrix4worldViewProj;
worldViewProj= driver->getTransform(video::ETS_PROJECTION);
worldViewProj*= driver->getTransform(video::ETS_VIEW);
worldViewProj*= driver->getTransform(video::ETS_WORLD);
if(UseHighLevelShaders)
services->setVertexShaderConstant("mWorldViewProj",worldViewProj.pointer(), 16);
else
services->setVertexShaderConstant(worldViewProj.pointer(),4, 4);
//设置摄像机位置
core::vector3dfpos = device->getSceneManager()->