Irrlicht学习备忘录——10 Shaders

10 Shaders        官方代码($sdk)\examples\10.Shaders       这个例子是在irr里使用DX和OpenGL的Shader,使用Shader创建新的材质类型。       同固定管线渲染一样,使用Shader也需要用到很多矩阵,但是这些矩阵信息不再是irr自动提供,而是通过继承IShaderConstantSetCallBack接
摘要由CSDN通过智能技术生成

10 Shaders

        官方代码($sdk)\examples\10.Shaders


       这个例子是在irr里使用DXOpenGLShader,使用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()->

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值