软件注册站
热情软件屋

 
在DirectX8中,可不可以在打开光照的情况下还保留有自己定义的顶点颜色
编号: QA004942    
建立日期: 2006年8月13日 最后修改日期: 2006年8月13日
所属类别: Visual Basic - 图形、图象
   
    操作系统:WindowsXP
    编程工具:VB6.0
    问题:在DirectX8中,可不可以在打开光照的情况下还保留有自己定义的顶点颜色?我用的语言是VB6.0,操作系统是WindowsXP。因为我试过几次都没能成功,即使说打开光照后自定义的顶点颜色就消失了,取而代之的是光照的颜色;只有关掉光照后自定义的顶点颜色才起作用。谢谢!(佚名)
   
    由于D3D和OGL的固定管线在使用了灯光之后,其计算出来的最终的灯光数据是以逐顶点的颜色,即DIFFUSE数据流输出的。但是如果物体原本就已经包含了逐顶点的颜色的话,就会和灯光计算出来的结果产生冲突,会把灯光的数据洗掉,这就是两者不能同时开的原因了。
    解决的方法只有一种,那就是两个Pass才能完成这种情况的渲染。
    第一次渲染时,将D3DRS_COLORVERTEX状态设置为FALSE,即关闭掉顶点颜色,然后将D3DRS_LIGHTING设置为TRUE,即打开灯光,同时设置D3DRS_DIFFUSEMATERIALSOURCE为D3DMCS_MATERIAL,即材质的Diffuse颜色从材质的定义数据中来,然后DrawPrimitive完成第一次渲染。
    第二次渲染时,将D3DRS_SRCBLEND设置为D3DBLEND_SRCCOLOR,将D3DRS_DESTBLEND设置为D3DBLEND_DESTCOLOR,还有D3DRS_BLENDOP设置为D3DBLENDOP_ADD,这个意思是开启颜色Blend算法,即马上就要画的物体的颜色与屏幕上已经有的颜色做混合,且混合的方式是“源颜色 加上 目标颜色”。接着,将D3DRS_COLORVERTEX打开,D3DRS_DIFFUSEMATERIALSOURCE设置为D3DMCS_COLOR1,灯光仍然保持打开,这样就等于启用了顶点颜色中所定义的Diffuse数据。OK了,现在再打开D3DRS_ALPHABLENDENABLE,再DrawPrimitive,就可以将物体的第二个Pass画到屏幕上去了。
    从解决的方法可以看到,确实不是很简单,过程比较讨厌,但是没有办法,因为这是固定管线。其实固定管线在现在的任何一款新引擎开发中,已经很少使用了,甚至都不再使用完全被抛弃了,转用Shader了。就是因为固定管线“傻、笨和太死板,只能按照固定的方式来做”。呵呵。

    

此问题由寒轩回答。

附加关键字:编程, 源程序, programming, source code, Visual Basic, VB, 图形、图象, picture, graph, image, draw

   
 
把这个问题推荐给朋友
   
 
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio