游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5099|回复: 12

SetRenderState() 如何让物体高亮?

[复制链接]

6

主题

21

帖子

21

积分

注册会员

Rank: 2

积分
21
发表于 2008-6-30 15:36:00 | 显示全部楼层 |阅读模式
选中物体,简单实现其高亮,用SetRenderState能否?

2

主题

132

帖子

132

积分

注册会员

Rank: 2

积分
132
发表于 2008-6-30 23:09:00 | 显示全部楼层

Re:SetRenderState() 如何让物体高亮?

具体是哪种高亮呢?普通的高亮可以用SetTextureStageState实现。。不过推荐使用可编程的流水线渲染,不要用固定流水线。。

6

主题

21

帖子

21

积分

注册会员

Rank: 2

积分
21
 楼主| 发表于 2008-7-1 09:08:00 | 显示全部楼层

Re:SetRenderState() 如何让物体高亮?

SetTextureStageState  我怎么找不到这个函数

2

主题

141

帖子

141

积分

注册会员

Rank: 2

积分
141
发表于 2008-7-1 09:53:00 | 显示全部楼层

Re: SetRenderState() 如何让物体高亮?

教你招FVF下比较实用的
1. SetRenderState( ALPHABLENDENABLE, FALSE );
   用正常的纹理渲染你的Mesh
2. 用一张光照纹理替换你的Mesh纹理, 要高光的地方就是白、没光的地方就是黑
   SetRenderState( ALPHABLENDENABLE, TRUE );
   SetRenderState( D3DRS_SRCBLEND, D3DBLEND_ONE );
   SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );
   渲染你的mesh
你就会得到有高光效果的mesh 其实和shader实现一个道理,但是适合哪怕不支持shader的旧机器。
思路扩展:第二步时用连续变化的(比如32张)纹理,来渲染你的mesh,看到什么了?

2

主题

132

帖子

132

积分

注册会员

Rank: 2

积分
132
发表于 2008-7-1 10:11:00 | 显示全部楼层

Re: Re:SetRenderState() 如何让物体高亮?

bowdar: Re:SetRenderState() 如何让物体高亮?

SetTextureStageState  我怎么找不到这个函数


呃..就是
HRESULT IDirect3DDevice9::SetTextureStageState (
    DWORD Stage,
    D3DTEXTURESTAGESTATETYPE Type,
    DWORD Value );
这个函数呀。不可能没有吧。 [em10]

2

主题

132

帖子

132

积分

注册会员

Rank: 2

积分
132
发表于 2008-7-1 10:15:00 | 显示全部楼层

Re: Re: SetRenderState() 如何让物体高亮?

chesskillerboss: Re: SetRenderState() 如何让物体高亮?

教你招FVF下比较实用的
1. SetRenderState( ALPHABLENDENABLE, FALSE );
   用正常的纹理渲染你的Mesh
2...


嘿嘿,这个方法比较方便,但是开销就大了,mesh要渲染两次,而且两次渲染得mesh重合在一起了,还需要设置ZComp模式。

用 ID3DXEffect,也不一定要用到 Shader 啊,旧机器也是支持的。

设置混合状态或者使用Shader只需要渲染一次就行了。

6

主题

21

帖子

21

积分

注册会员

Rank: 2

积分
21
 楼主| 发表于 2008-7-1 17:25:00 | 显示全部楼层

Re:SetRenderState() 如何让物体高亮?

SetTextureStageState()  这个函数的参数好复杂,搜了一下,没有明确讲参数的意义,该怎么用呢?英文看不懂

2

主题

132

帖子

132

积分

注册会员

Rank: 2

积分
132
发表于 2008-7-1 18:48:00 | 显示全部楼层

Re:SetRenderState() 如何让物体高亮?

那个函数的参数确实有点麻烦.. 这里不好说,你加我qq吧. 103226172. 说明一下验证信息.

6

主题

21

帖子

21

积分

注册会员

Rank: 2

积分
21
 楼主| 发表于 2008-7-2 09:20:00 | 显示全部楼层

Re:SetRenderState() 如何让物体高亮?

在公司不能用即时通讯软件。。。。

2

主题

132

帖子

132

积分

注册会员

Rank: 2

积分
132
发表于 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 就是参数太多。
挨着说要写很多,不过上面的就可以实现你的效果了。
实现其他效果下次遇到再说吧。。=_=|||
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-22 03:01

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表