游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2656|回复: 3

关于shader的预编译问题

[复制链接]

15

主题

62

帖子

64

积分

注册会员

Rank: 2

积分
64
发表于 2010-3-7 19:11:00 | 显示全部楼层 |阅读模式
今天看realtimerendering的时候,看到这样的一段话:
一种常用的解决办法是写一段将要被编译很多次的足够长的shader,然后每次用语言的特性或是预编译来创建不同特点版本的shader。这个称之为supershader。

不过不是很明白,google了一下supershader,看到一段cg的代码,里面很多预编译命令如#ifdef #define....
然后根据不同的define进行编译。

这让我想到前不久一个前辈告诉我的话,说有的引擎会建立很大的shader,但是里面一般都是很小的函数,然后根据不同的需求,连接成需要的shader。

不知道这两个说的是不是同一回事,如果是的话,那这样做具体的实现办法是什么呢?所谓“将小的函数连接成新的shader”具体要怎么做呢?

我最近在胡乱自己建立框架,但是在封装shader和effect的时候,很是郁闷。因为shader毕竟需要单独编译,没有外面是用api编写的代码有足够多的自由。比如不同的材质,或是不同的效果,难道每需要一个effect就建立一个effect?或者一个technique?这样明显会有很多代码冗余的地方,而且也不方便管理。

请牛人指教一下。自己还没有系统的看过一个引擎,这地方还是很迷茫啊。。。

21

主题

136

帖子

165

积分

注册会员

Rank: 2

积分
165
发表于 2010-3-7 21:05:00 | 显示全部楼层

Re:关于shader的预编译问题

放弃effect封装。回到原始的shader入口函数即可。
一个材质模板一个shader。这个shader就是用一个通用的里面加了n多#ifdef的shader。在编译这个shader时。只用添加这个材质需要的#if定义的开关宏即可。仔细看下编译shader 的那个函数,要求传一个宏列表进去就是这个道理了。。

15

主题

62

帖子

64

积分

注册会员

Rank: 2

积分
64
 楼主| 发表于 2010-3-7 22:23:00 | 显示全部楼层

Re:关于shader的预编译问题

我看过了,里面是有个#define,按照前辈的意思是,我只需要有一个effect写一个类,以后用的时候直接这样调用?

21

主题

136

帖子

165

积分

注册会员

Rank: 2

积分
165
发表于 2010-3-7 23:08:00 | 显示全部楼层

Re:关于shader的预编译问题

差不多那个意思吧。怎么方便怎么写。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-12 17:43

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表