|
|
发表于 2008-7-2 11:51:00
|
显示全部楼层
Re:SetRenderState() 如何让物体高亮?
呃。。在公司啊,msn也不能用啊。
那个函数设置纹理混合。
HRESULT SetTextureStageState(
DWORD Stage,
D3DTEXTURESTAGESTATETYPE Type,
DWORD Value
);
Stage是设置第几层的纹理
Type是设置第Stage层的状态类型
Value是第Stage层的Type的状态类型的具体值
这个感觉不怎么好解释,举例子好些吧。
比如有一个纹理是
IDirect3DTexture9* ptex;
顶点格式是 Xyz | Tex1
那么这样设置
SetTexture( 0, ptex );
SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
就表示第0层的颜色操作(ColorOp)直接使用第1个参数(SelectArg1),
而第一个颜色参数(ColorArg1),是Texture,意思就是第0层的颜色值就为贴图的颜色,
即 SetTexture 设置在第0层的纹理ptex
然后第0层关闭了透明通道(Alpha)操作,AlphaOp = Disable,所以纹理不会有透明效果
然后第1层的ColorOp和AlphaOp都为Disable,混合到此为止。
比如你说的加亮物体。那个物体本来有个纹理,然后你希望和你设置的顶点颜色进行混合
然后最后再把物体的RGB颜色值加亮,可以这样设置
SetTexture( 0, texture ); // 设置你的纹理
/*
ColorArg1 = Texture; // 颜色参数1为纹理颜色
ColorArg2 = Diffuse; // 颜色参数2为顶点里面的颜色
ColorOp = Modulate; // 将两个参数相乘( Arg1 * Arg2 )
同理Alpha值也是这样运算。
*/
SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
/*
第1层的混合如下
Constant = 0x00404040; // 设置常量
ColorArg1 = Current; // 这个表示参数1位上一层混合后的结果
ColorArg2 = Constant; // 参数2为刚才设置的常量
ColorOp = Add; // 进行 Arg1 + Arg2,这个地方就实现颜色加亮效果了
// 这儿只对RGB相加,因此常量设置为 0x00404040(AARRGGBB),把RGB都加上0x40,
// 即实现了高亮。
AlphaArg1 = Current; // 透明通道参数1为上一层结果
AlphaOp = SelectArg1; // 直接使用Arg1,也就是上一层的结果
*/
SetTextureStageState( 1, D3DTSS_CONSTANT, 0x00404040 );
SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_CURRENT );
SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CONSTANT );
SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_ADD );
SetTextureStageState( 1, D3DTSS_ALPHAARG1, D3DTA_CURRENT );
SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
// 关闭第2层的混合,即混合到第1层就结束
SetTextureStageState( 2, D3DTSS_COLOROP, D3DTOP_DISABLE );
SetTextureStageState( 2, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
那个 SetTextureStageState 就是参数太多。
挨着说要写很多,不过上面的就可以实现你的效果了。
实现其他效果下次遇到再说吧。。=_=|||
|
|