再观HLSL

这些天看起了HLSL,虽然以前也看过,但一直没明白过,所以也没有深入过。虽然我不敢说现在已经深入了多少多少了,但多多少少,总还是学到了一些。

 

首先,shader中最重要的2个组成部分,便是VertexShader和PixelShader。这2个替代了固定流水线中的某些步骤,注意,是替代了,而不是添加了,所以在每一个shader中,都必须要有世界、观察、投影变换,这是最基本,除非有特殊目的,否则就必须要有这3种计算,除了这3种计算外,就可以自由发挥了。


VertexShader替代了固定流水线中的从世界坐标变换到投影变换以及光照计算着一大堆的步骤。至于裁剪,那本《DirectX 9.0 3D游戏开发编程基础》中是放在了投影变换之前,也就是说,按书上的说法,裁剪也被VertexShader替代了,但是在VertexShader中并没有类似的计算(也许是因为只有在真正需要的时候需要用户自己写的缘故)。


PixelShader则替代了光栅化中的某一步或某些步骤,根据那本书上说的,“它实际上替换了固定功能管线的多纹理化阶段”,至于这个多纹理化阶段到底是个怎么样的阶段,这本书上没有再详细介绍。

按我的理解,VertexShader所做的工作,最根本的目标是计算出一个显示屏幕上(比如1024 * 768)中哪些部分需要绘制(这里的“绘制”可能用上色更贴切点),然后PixelShader所做的工作,最根本的目标就是给这些确定的部分上色,当然,它是一个像素一个像素的来上色的。这样下来,显示屏幕上所呈现的就是这一帧所需要画面了。

 

接下来再说说使用的问题。


一个shader,它是如何跟你的程序进行通讯的呢?这里就得说下了,XNA确实比DirectX方便很多很多啊,光是从代码行数上就很明显了,毕竟是封装了DirectX的。但是相对的,增加了调用函数的开销(这里很容易就牵扯出C++和C#的效率问题,对此我不想多做评价,只是依个人意见,相对于大型项目,特别是那些对效率要求高的,C++是最合适的语言,而另外一些程序,C#更安全,开发周期和成本都要低些)。


在XNA中,只需要Effect 和 EffectParameter 2个对象就可以,这里假设effect是Effect的对象,worldParameter是EffectParameter的对象。
然后:effect = Content.Load<Effect>("SampleShader");
再然后:worldParameter = effect.Parameters["world"];//这个world是shader里的全局变量
再再然后:WorldParameter.SetValue(world);//这里的world是程序中的(全局)变量
再再再然后就是绘图了.

 

而在DirectX中就复杂很多了。


这些东西就是我第一次接触HLSL所一直迷惑的东西,这几天总算的解惑了,这里感谢下某位仁兄,和他讨论了一晚上,学到了不少啊,非常感谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值