游戏开发论坛

 找回密码
 立即注册
搜索
楼主: cO_olWinD

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

[复制链接]

29

主题

157

帖子

163

积分

注册会员

Rank: 2

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

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

呵呵,原来如此,那么只能按材质球将对象的排序,把使用相同材质球的对象放一起渲染了,这样每帧只需要切换几次就够了。

我要实现的效果里面有些应该是属于动态分支的。

顺便问一下,比如我要用shader实现固定管线的全屏雾的效果,是不是就属于静态分支?是不是就不会对渲染效率有太大的影响?

比如:

......
if(IsEnableFog == 1) // 1 = enable; 0 = disable
{
    fogMixFactor = .....; //计算雾的混合因子
    FinalColor = mix(Color, fogColor, fogMixFactor); //将像素颜色与雾的颜色按比例混合
}
else
{
    FinalColor = Color;
}

以上是一个shader的伪代码,如果雾效被开启,那么所有的像素都会执行与雾的混合计算。此刻是不是就算是静态分支?这种时候是不是就不会每个像素都判断if条件了?
假设我的显卡一次可以渲染16个像素,共有1600个像素,那么渲染一帧,是不是总共要判断100次if的条件?

如果是这样,即使静态分支也不如切换着色器速度快啊,尤其是场景内对象较多,但种类较少的情况下。而事实上所有的渲染抽象下来,好像就那么几种了。

19

主题

638

帖子

638

积分

高级会员

Rank: 4

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

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

静态分支的我都是编译到不同的technqiue了,相当于opengl的多个shader,所以没测过具体效果如何,只是看资料上那么说。静态分支实现与否要取决于编译器的优化能力,不过看编译生成的shader汇编代码还是优化的不错的。但还是要不断的调整源码以产生更好的汇编码。

假设我的显卡一次可以渲染16个像素,共有1600个像素,那么渲染一帧,是不是总共要判断100次if的条件?

绝对大于100,因为你不能保证每个三角形都不重叠。

不过我说的都是DX的情况。假设OpenGL如果能在一些uniform常量设置后编译shader,那么理论上它可以把分支优化掉。1.4以后的spec我没细看过,不知道它是否有别的优化。

19

主题

638

帖子

638

积分

高级会员

Rank: 4

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

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

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

。。。。都是荒唐言。。。。

你有什么高见么?

10

主题

53

帖子

57

积分

注册会员

Rank: 2

积分
57
发表于 2008-8-16 18:27:00 | 显示全部楼层

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

......
if(IsEnableFog == 1) // 1 = enable; 0 = disable
{
    fogMixFactor = .....; //计算雾的混合因子
    FinalColor = mix(Color, fogColor, fogMixFactor); //将像素颜色与雾的颜色按比例混合
}
else
{
    FinalColor = Color;
}

弱弱的问一下,怎么在渲染过程中动态的控制shader中的分支呀,即假如一帧中你要绘制两张图片,一图需要效果1,一张需要效果二,代码要怎么写才能改变shader中if的值一张为真,一张为假呀

5

主题

686

帖子

697

积分

高级会员

Rank: 4

积分
697
QQ
发表于 2008-8-16 22:27:00 | 显示全部楼层

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

LS所说的是动态分支吧,LZ的情况用静态分支就可以了,这个基本不影响性能的

10

主题

53

帖子

57

积分

注册会员

Rank: 2

积分
57
发表于 2008-8-17 12:09:00 | 显示全部楼层

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

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

LS所说的是动态分支吧,LZ的情况用静态分支就可以了,这个基本不影响性能的

嗯,我说的确实是动态分支,但是不知道要怎么实现才好,不知各位有何高见

19

主题

638

帖子

638

积分

高级会员

Rank: 4

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

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

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


嗯,我说的确实是动态分支,但是不知道要怎么实现才好,不知各位有何高见

你的这个是静态分支

201

主题

1437

帖子

1963

积分

金牌会员

Rank: 6Rank: 6

积分
1963
QQ
发表于 2008-8-24 21:29:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

201

主题

1437

帖子

1963

积分

金牌会员

Rank: 6Rank: 6

积分
1963
QQ
发表于 2008-8-24 21:32:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

29

主题

157

帖子

163

积分

注册会员

Rank: 2

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

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

嗯,我用的就是自己写的一个GLSL代码生成类,传入材质球的类型bits,输出shader代码。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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