<DX9随笔>一.顶点色 光照 纹理

         现在已经都快DX12了,但是国内很多游戏公司还是使用DX9。虽然固定管线应该被淘汰了,不过仍然顽强的存活着。理解固定管线的流程细节,对于掌握整个3D框架还是很有帮助的。     

        看完Frank D. Luna 所著的《Introduction to 3D Game Programming with directx9》,也就是所谓的龙书,有很多疑问。因为作者将许多细节都隐藏起来了,我们只能自己去琢磨,搜索答案。

        在看完顶点颜色跟光照两章后,一直疑惑如果既有顶点色又有光照,结果会如何。经过不断调整API实验后,得出一些可能不太准确的结果。固定管线的流程中,大致可以分为两种情况:有光照和无光照。 

        关闭光照时,首先起作用的是顶点色,然后在应用纹理的时候就需要看SetTextureStageState设置的状态确定最终颜色。一般来说,设置纹理颜色操作由3个很重要的参数来控制,比如一组参数:


Device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE)
Device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE)
Device->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE)


        第一个参数控制的是第几层纹理阶段,这里统一处理的是第一层纹理阶段的操作。D3DTSS_COLOROP表示我们要设置颜色操作,D3DTOP_MODULATE表示颜色操作用乘法。每层纹理阶段有3个颜色参数,分别是D3DTSS_COLORARG0,D3DTSS_COLORARG1和D3DTSS_COLORARG2。常用的颜色操作都是由D3DTSS_COLORARG1和D3DTSS_COLORARG2来参与的,乘法也是。有了参数,需要给定参数取值来源。用D3DTA_TEXTURE标志告诉硬件颜色从纹理取,D3DTA_DIFFUSE则是从顶点颜色取值,这里需要注意,如果顶点声明里面没有颜色分量,diffuse的默认值会是0xffffffff,即白色。所以上面代码就表示了第一层纹理操作的时候,我们要从纹理和顶点里分别取出颜色,然后做乘法得到的结果就是输出的颜色了。


        如果只想要纹理的颜色或者顶点的颜色怎么办,将D3DTSS_COLOROP状态的参数设置成D3DTOP_SELECTARG1或者D3DTOP_SELECTARG2就可以了。

 

        有一些额外的信息需要关注,除了第一层纹理颜色操作默认为D3DTOP_MODULATE外,其他层都是D3DTOP_DISABLE。D3DTSS_COLORARG1默认值为D3DTA_TEXTURE。D3DTSS_COLORARG2的默认值为D3DTA_CURRENT。D3DTA_CURRENT是什么意思?它是指用上一层的混合结果作为输入。假如上面代码所示的程序有第二层纹理,那么第二层纹理的D3DTSS_COLORARG2值就是做乘法得到的输出值。可能大家注意到了,第一层怎么取上一阶段的结果,压根就没有啊。其实第一层就是直接用的D3DTA_DIFFUSE。


        没有光照,顶点颜色大致就是这样计算出来的。

        开光照情况要复杂一点。

        计算公式应该是环境光 + 漫反射 + 高光,高光默认是关闭的,因为代价比较高。


        环境光是由材质跟光源共同决定的。然后是漫反射。计算方式跟关闭光照基本一样,差别在于diffuse取值来源。上面说了,第一层直接用的D3DTA_DIFFUSE,是从顶点色中取得的。打开光照后,获取的地方增加到了3处:材质、漫反射顶点颜色、镜面反射顶点颜色。使用>SetRenderState函数设置D3DRS_DIFFUSEMATERIALSOURCE状态可以指定来源。D3DRS_DIFFUSEMATERIALSOURCE可以使用3个值,分别是D3DMCS_MATERIAL、D3DMCS_COLOR1和D3DMCS_COLOR2,与上面说的3处来源对应。默认值为D3DMCS_COLOR1,从顶点色中取值。比如


Device->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL)指定我们从材质来获取diffuse色。

       高光呢, 暂时就不多谈了。留待以后吧。


       以上就是DX9固定管线光照大致计算流程。可能有些遗漏和错误,希望大家指正。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值