TA的每日心情 | 慵懒 2015-1-8 08:46 |
---|
签到天数: 2 天 连续签到: 1 天 [LV.1]测试小兵
|
今天说说如何调试shader? 看起来不是个问题,但很多开始接触shader的同学,总会问这样的问题,因为shader不像一般的cpu指令,它是跑在gpu下的指令,而gpu没有提供了调试功能(至少据我所知),所以看似调试shader是不可能的任务。
幸运的是,在d39中提供了调试shader的方法,还附带visual studio的插件,以方便调试。具体请参考d3d9的帮助文档,搜索Shader Debugger章节,里面有详细的描述,简单的说,就是d3d9模拟了gpu的行为,让所有gpu的指令在cpu模拟下运行,然后就可以断点调试了,不过不得不说的是,调试shader非常慢,特别是ps,因为cpu模拟ps的行为很耗时,而vs相对要快点,如果vs1.1的调试基本可以和本地代码相当,因为vs1.1的行为用cpu模拟也很快,这也是为什么d39内建软件模拟vs1.1,而且这个模拟的速度是可以接受的,所以现在我写很多vs代码,如果用到vs1.1特性,都当作硬件默认支持,就算不支持,软件模拟也是可以接受的。
虽然讨论了如何调试shader,但真正的断点(我想这也是想调试shader的目的)跟踪shader有必要吗?我在我们的游戏里写了很多的shader,但真正断点跟踪调试的shader一次也没有,首先是因为速度慢,其次就是因为断点跟踪也没有多大帮助,因为vs/ps一般都很短小,我一般采用插入特征代码的方式来附注调试,比如怀疑那个矩阵、坐标有问题,就写死那些变量,看看渲染的结果有没有变化来排除为题的原因,对于ps,也是如此,写死某些颜色的计算、把法线映射成颜色查看是否正确,因为图形渲染更直观,比单纯的看寄存器的数据有帮助。
当然随着gpu越来越强大,在gpu中加入调试的功能应该还是有必要的,等gpu发展到一定成都,gpu就不单可以做图像计算了,甚至其他方面的逻辑、数学计算,比如目前流行的gpu物理模拟,gpu数学加密等算法。 |
|