永远也不完美的程序

不断学习,不断实践,不断的重构……

常用链接

统计

积分与排名

好友链接

最新评论

Material与shader在设计上的难题!

        为了设计上的灵活,我把shader、纹理等都封装到材质(Material)里,以方便渲染对象在不同状态下材质的切换以达到不同的渲染效果。
        但涉及到shader的设计就比较麻烦,因为shader需要设置里面的参数,但由谁负责传参数给它呢?如果由渲染对象负责,那么每个材质只要有shader,就每个渲染对象更新一次,这样问题来了,一但切换了材质后怎么办?因此否定了这种做法。
        另一种做法是由材质更新shader的参数,但材质怎么知道shader要什么参数呢?这样岂不是每个材质要针对不同的shader继承一个类?这样设计也不灵活。而且shader需要更新的参数有时是来自渲染对象的。
        到这里就比较头痛了,到现在,我只能由shader自己主动更新自己的参数。从shader中获得参数列表,遍历并更新。但这里也有问题,当shader需要来自渲染对象中比较特殊的参数时,应该怎么取呢?例如要取水的纹理扰动值等,我不可能在渲染对象的基类抽象出一个GetWaterDistort()这样的接口吧?暂时想到的解决方法是:在每个渲染对象里定义一个表,存放shader需要的参数,key为shader的参数名,value为其值。不过问题也出来:不知道值的size。不过可以暂时写死在一个结构体中。
        不知道各位高人有什么意见,这问题困扰我太久了!

posted on 2009-05-15 10:30 狂烂球 阅读(2052) 评论(8)  编辑 收藏 引用 所属分类: 图形编程

评论

# re: Material与shader在设计上的难题! 2009-05-15 22:03 Davy.xu

参考下OGRE的Compositor系统架构,自己做的材质脚本解析器,很强大的组合材质功能。

我本人偏向于:每一种效果,比如水波动,使用渲染脚本和材质参数来参与定制后,如果在运行时需要定制,直接使用类似于shader参数一样的字符串变量来设置,只不过这时候的接口是你自己的材质系统,这样就可以适合各种材质效果了。  回复  更多评论   

# re: Material与shader在设计上的难题! 2009-05-16 21:57 魔鬼螳螂

@Davy.xu
OGRE的材质脚本我看过,作为一个成熟的引擎,是非常有必要引入材质系统的。
不过不明白你这句话是什么意思:直接使用类似于shader参数一样的字符串变量来设置。
设置材质参数?如果材质参数需要通过某种方式计算出来呢?  回复  更多评论   

# re: Material与shader在设计上的难题! 2009-05-17 22:27 shanoa

博主的困扰我似乎看明白了,你是否可以就按照你说的用map来记录shader参数列表呢?
key=参数名
value={参数长度,参数}  回复  更多评论   

# re: Material与shader在设计上的难题! 2009-05-17 22:36 魔鬼螳螂

@shanoa
嗯,现在是这样做了……  回复  更多评论   

# re: Material与shader在设计上的难题! 2009-05-19 14:08 向往

这个问题也困扰我好久了,值得探讨.期望早出解决方法.  回复  更多评论   

# re: Material与shader在设计上的难题! 2009-05-19 22:17 Davy.xu

参考下http://www.hellocpp.net/Articles/Article/437.aspx  回复  更多评论   

# re: Material与shader在设计上的难题! 2009-06-20 22:41 Loki

阿梁生,唔好误导人啊,哈哈  回复  更多评论   

# re: Material与shader在设计上的难题! 2009-06-21 10:24 魔鬼螳螂

@Loki
边位啊?所上名来!  回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理