游戏开发论坛

 找回密码
 立即注册
搜索
查看: 13360|回复: 21

【求教】关于shader中使用if的效率问题

[复制链接]

29

主题

157

帖子

163

积分

注册会员

Rank: 2

积分
163
发表于 2008-8-14 20:01:00 | 显示全部楼层 |阅读模式
假设现在我的场景中的所有物体可以分为两类:

1)带一张普通纹理贴图的。
2)带一张普通纹理贴图和一张光照图的。

如果我要使用shader替换固定管线来渲染上述物体,那么我有两种方式来写shader:
1)在一个shader中用条件选择语句(如if)来分别渲染以上物体。
2)写两个shader,分别处理相应的渲染。在C++中判断物体的材质类型,并根据材质类型切换使用相应的shader程序。

那么,请问以上两种方法那一种效率比较高呢?

ps:上述的情况只是举例而已,其实很多时候会遇到这种情况:如果两个物体的渲染方式差别很大,那么毫无疑问用两个shader。可是如果两个物体的渲染方式相近,但又不完全相同,这种时候是用if还是写成两个shader呢?


19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2008-8-14 20:22:00 | 显示全部楼层

Re:【求教】关于shader中使用if的效率问题

2的效率高,高比较多
分支语句的开销很大,因为它破坏SIMD并行,虽然在SM3以来已经有很大改善

一般来说,一个引擎用4、5个shader都是可行的,你才2个,已经非常少了。

29

主题

157

帖子

163

积分

注册会员

Rank: 2

积分
163
 楼主| 发表于 2008-8-14 21:24:00 | 显示全部楼层

Re:【求教】关于shader中使用if的效率问题

呵呵,以前用固定管线的时候,都是根据对象的渲染方式打开或关闭相应的功能来渲染各种对象。
可是使用shader代替固定管线的话,shader的代码是怎么产生的呢?
说具体点,就是比如说我有一个编辑器,里面提供什么HDR,雾,光照贴图、动态光照、BumpMap,RTT等功能,且这些功能全部使用shader, 其中每个单独的功能,我们平时写demo的时候,会将shader代码写到一个文件里,然后读取。但是此刻这些功能放在一起,用户可以任意的选择,那么代码怎么组合起来呢? 我现在实现的方式就是根据材质球的内容,动态的组合生成代码(并不保存在文件中)。 不知有没有更好的方法?

34

主题

629

帖子

629

积分

高级会员

Rank: 4

积分
629
发表于 2008-8-14 22:20:00 | 显示全部楼层

Re:【求教】关于shader中使用if的效率问题

1和2效率是一样的

拜托搞清楚static branch和dynamic brach的区别先

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2008-8-15 09:36:00 | 显示全部楼层

Re:【求教】关于shader中使用if的效率问题

恩,没注意,这个确实是static branching。
问题是如果不分成多个shader,或者说不分成多个fx文件里的technique,判断仍然是在GPU上做的,而不是预先做好的。所以还是1效率高。

1

主题

103

帖子

119

积分

注册会员

Rank: 2

积分
119
发表于 2008-8-15 13:38:00 | 显示全部楼层

Re:【求教】关于shader中使用if的效率问题

一群人不懂装懂,static branch就没有开销了?一个”只访问一个texture“和一个”有可能同时访问两个texture的“的shader效率能一样,texture cache的利用率都不一样。

29

主题

157

帖子

163

积分

注册会员

Rank: 2

积分
163
 楼主| 发表于 2008-8-15 16:55:00 | 显示全部楼层

Re:【求教】关于shader中使用if的效率问题

啊哈哈,不好意思,其实我使用的是OpenGL的GLSL,所以static branch和dynamic brach我不明白什么意思,不过我想这种问题主要是和显卡的工作方式相关的,和API的关系不大。换个说法,就是:显卡的可编程着色器里是使用if的速度快,还是切换可编程着色器程序块儿的速度快?

我想两个shader程序之间的切换也是要时间的, 不过如果shader中用if的话,根据显卡工作的原理,那么岂不是每个vertex或每个pixel都用判断一次if的条件?

29

主题

157

帖子

163

积分

注册会员

Rank: 2

积分
163
 楼主| 发表于 2008-8-15 17:04:00 | 显示全部楼层

Re:【求教】关于shader中使用if的效率问题

很多道理是相通的,我觉得这个问题其实就是一个把 if放到循环外边速度快,还是放到循环里面速度快的问题。理论上来说当然是放在循环外边速度快。 但是我不敢确定自己对显卡工作方式的理解是否正确,不知道显卡硬件方面有没有做什么优化或预处理,比如编译时会不会自动把if下的代码提取出来? 毕竟显卡发展太快了,书上讲的都是很老的东西了。

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2008-8-15 19:43:00 | 显示全部楼层

Re:【求教】关于shader中使用if的效率问题

切换shader的开销非常大,所以要把使用相同shader的mesh一起渲染,减少切换次数。如果是编译时能确定分支方向的话,编译器就能优化掉,否则就必须每个vertex/pixel的执行。shader程序是n个像素用SIMD指令同时处理的,所以静态分支就是编译器能确定所有shader线程的分支方向都相同的情况,而动态分支就意味者shader必须串行化处理这部分分支代码。

121

主题

2029

帖子

2034

积分

金牌会员

Rank: 6Rank: 6

积分
2034
QQ
发表于 2008-8-15 20:01:00 | 显示全部楼层

Re:【求教】关于shader中使用if的效率问题

。。。。都是荒唐言。。。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-21 13:27

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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