D3D9的一些菜有关问题
D3D9的一些菜问题
学习D3D9也有些时候了,有些问题还是不明白,在这里一起问一下,先谢谢答疑的热心人!
1、我在渲染纹理前颜色缓存和深度缓存被这样清理:
从现象上看,渲染出的纹理上没有物体的地方颜色值应该是D3DXCOLOR(0.5f,0.5f,0.5f,1.f)才对,但我在使用过程中发现并不一致,是我用错了,还是那个颜色值被改写了?
2、记得以前在哪里看到过说雾效和alpha混合不兼容,现在找不到出处了。我做的时候也是不能同时做出来:开启了alpha混合雾就没有了。不知道达人们是怎么处理的,提供个思路最好了。
3、树叶之类的有alpha通道的物件无法接受阴影贴图,即使是一般贴图的物件,一打开alpha混合阴影立即消失,有没有什么好办法让树叶上也有影子。
4、在XP上做的D3D程序,运行一切正常,拿到Windows7 64位上运行,法线贴图效果消失,这是为什么?32位系统上我没试过。
再次谢谢高手们解惑,100分略表心意!
------解决方案--------------------
好久没有用D3D了,看到这里我觉得:
1、是不是纹理的格式有限制?不是D3DFMT_A8R8G8B8?
4、Windows7使用的D3D库和XP的不同,分别在XP和Windows7中看看运行库依赖有没有什么不同。尽量让运行环境相同。
------解决方案--------------------
问题2:
如果你使用固定管线,雾效的计算是在blending之前的。也就是说:
假设雾的颜色为Cf,Alpha混合公式为Cs*As+Cd*Ad,
你期望得到:(Cs*As+Cd*Ad)*f+Cf*(1-f),实际上你会得到(Cs*f+Cf*(1-f))*As+(Cd*f+Cf*(1-f))*Ad,结果是不同的。
经过简单的数学推导可以得知如果使用正常的alpha混合也就是(Alpha,1-Alpha)的方式,这两个结果是相同的,但是如果采用(1,1)的混合方式,在做混合的Pass时你需要把雾的颜色设置为黑色(RGB都是0)
最后强烈建议采用可编程管线来处理有雾效
问题3:
可以在渲染树叶之类物体的时候使用Alpha Test而非Alpha Blend
学习D3D9也有些时候了,有些问题还是不明白,在这里一起问一下,先谢谢答疑的热心人!
1、我在渲染纹理前颜色缓存和深度缓存被这样清理:
pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DXCOLOR(0.5f,0.5f,0.5f,1.f), 1.0f, 0) ;
从现象上看,渲染出的纹理上没有物体的地方颜色值应该是D3DXCOLOR(0.5f,0.5f,0.5f,1.f)才对,但我在使用过程中发现并不一致,是我用错了,还是那个颜色值被改写了?
2、记得以前在哪里看到过说雾效和alpha混合不兼容,现在找不到出处了。我做的时候也是不能同时做出来:开启了alpha混合雾就没有了。不知道达人们是怎么处理的,提供个思路最好了。
3、树叶之类的有alpha通道的物件无法接受阴影贴图,即使是一般贴图的物件,一打开alpha混合阴影立即消失,有没有什么好办法让树叶上也有影子。
4、在XP上做的D3D程序,运行一切正常,拿到Windows7 64位上运行,法线贴图效果消失,这是为什么?32位系统上我没试过。
再次谢谢高手们解惑,100分略表心意!
------解决方案--------------------
好久没有用D3D了,看到这里我觉得:
1、是不是纹理的格式有限制?不是D3DFMT_A8R8G8B8?
4、Windows7使用的D3D库和XP的不同,分别在XP和Windows7中看看运行库依赖有没有什么不同。尽量让运行环境相同。
------解决方案--------------------
问题2:
如果你使用固定管线,雾效的计算是在blending之前的。也就是说:
假设雾的颜色为Cf,Alpha混合公式为Cs*As+Cd*Ad,
你期望得到:(Cs*As+Cd*Ad)*f+Cf*(1-f),实际上你会得到(Cs*f+Cf*(1-f))*As+(Cd*f+Cf*(1-f))*Ad,结果是不同的。
经过简单的数学推导可以得知如果使用正常的alpha混合也就是(Alpha,1-Alpha)的方式,这两个结果是相同的,但是如果采用(1,1)的混合方式,在做混合的Pass时你需要把雾的颜色设置为黑色(RGB都是0)
最后强烈建议采用可编程管线来处理有雾效
问题3:
可以在渲染树叶之类物体的时候使用Alpha Test而非Alpha Blend