d3d9 固定管线,打开光照的情况下还保留有自己定义的顶点颜色
2008-12-30 16:55
399 查看
由于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画到屏幕上去了。
解决的方法只有一种,那就是两个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画到屏幕上去了。
相关文章推荐
- unity shader 固定管线实例(一) 基础光照效果纯颜色
- unity shader 固定管线实例(二) 光照 颜色和纹理
- 自己写了个table 固定table头部 使表可以滚动 注意稍不注意表头和表体就会出现不对齐的情况
- 网页制作——字的颜色自己定义
- unity shader 固定管线实例(三) 光照 自发光混合 纹理混合
- android实现下拉框(spinner),自己定义大小颜色背景位置,去掉默认样式黑边
- 【解答】OpenGL 定义顶点和顶点颜色时为什么都用0x10000这个值
- gvim 使用自己喜欢的颜色方案打开
- vim: 自己定义颜色主题(colorscheme)
- 自己定义滚动条的颜色
- Python 实现类似PHP的strip_tags功能,并能够定义他们自己的一套保留标记
- D3D中光照,顶点法线,顶点结构,顶点颜色
- 固定管线中的光源位置与顶点位置提交的差异
- IOS总结_无需自己定义UITabbar也可改变UITabbarController的背景和点击和的颜色
- unity 固定管线shader转换到顶点片段着色器
- iOS 要定义自己的导航栏button样式Button Image 执行出彩是不一样的与原来的颜色 -解
- 写一个自己定义进度颜色和圆形转动的ProgressBar(具体介绍)
- 顶点颜色在光照计算中的作用
- 自己定义协议,从一个app打开另一个app
- poj1661-这题目简单dp但是要考虑情况比较多,wa了n次死在了自己定义的无穷大上面