轻松学纹理渲染

概述

纹理渲染是一个奇妙的技术。以前的3D游戏由于技术的限制,地形的渲染只是把固定的纹理渲染到模型或者LOD上。随着GPU的渲染水平不断提高,现在的3D编程已经从CPU编程转变为GPU编程,从固定管线渲染 (FixedFunctionPipeline)转变到可变管线渲染(ProgrammablePipeline),从固定的程序编译转变成Shade编程,由此出现HLSL (High Level Shade Language和Cg(C for Graph)等等。但一些对显示效果要求较低或者受到用户显卡渲染水平的限制的游戏仍然需要一种速度很快,简单容易实现的技术,纹理渲染就是这样一个很有效的技术。

2006520232628541.jpg

 

 

 

 

 

 

 

 

 

 

你也许听说过这些名词:多层纹理渲染,MultiPass,SinglePass,光影等等,这些都属于纹理渲染的范围。

简单的理解,纹理渲染既是:将多个纹理的Alpha层,Color层分别进行各种混合处理后得到最终渲染的纹理。

纹理渲染分为MultiPass,SinglePass。这里的Pass可以理解为设置一次渲染状态后,按照制定的纹理 渲染物体。其中对于大多数的显卡都支持MultiPass的渲染。其过程是,将每次的渲染结果渲染到物体上,然后下一次的渲染结果以某种参数方式再次混合到上次的物体上。这种技术的好处是结构简单,对于小规模的低多边形的渲染效果相对较好。但是由于一个物体要渲染多次,这样就降低了渲染速度。而 SinglePass解决了这个问题,对于一些较好的显卡提供了这种功能,它能在一次渲染中完成多层的混合任务,最后输出混合结束的纹理。

2006520232628969.jpg

 

Direct3D能在一个多边形上渲染8层纹理。这对于我们已经足够了,一般的大游戏中,最多使用3层也就能达到好的效果。假设我们有一面墙,第一层使用原帖图,第二层我们为墙面添加一些光影效果,有的地方暗有的地方正常。第三层,添加一些渲染纹理做出来的光照。这里的光照和固定管线中的光照不一样,渲染效果一般要比它好的多,并且速度有所保证。最后我们看到的就是一个和真是墙面差不多的效果。

Direct3D中的纹理渲染编程有点类似于汇编。D3D提供了2个参数器(Arg1,Arg2),和一个混合操作器(Op)。使用Arg与现有的纹理进行关联赋值,使用Op对Arg进行制定的混合,最后就可以完成混合任务。在Arg中又分为Alpha通道和Color通道,特定的通道参数器和纹理关联后,混合时就制定对特定的参数混合。比如选定 AlphaArg1关联纹理,然后使用Op选中Arg1那么最后渲染时,混合器就会只处理纹理的Alpha通道。                                  

前面说了很多概论,现在看看D3D的渲染方法就会很明白了吧。Stage就是渲染流水线中的一道工序。完成了后将本次的渲染结果作为下次的参数(Arg)。

2006520232628554.gif

D3D中的纹理渲染函数

HRESULT SetTextureStageState(DWORD Stage,
D3DTEXTURESTAGESTATETYPE Type,
DWORD Value
);

其中Type常用的有

Typedef enum_D3DTEXTURESTAGESTATETYPE{
D3DTSS_COLOROP=1,
D3DTSS_COLORARG1=2,
D3DTSS_COLORARG2=3,
D3DTSS_ALPHAOP=4,
D3DTSS_ALPHAARG1=5,
D3DTSS_ALPHAARG2=6,
D3DTSS_COLORARG0=26,
D3DTSS_ALPHAARG0=27,
}D3DTEXTURESTAGESTATETYPE;

具体的和上面2个表相同,后面的OP,ARG就是混合器和参数。

Value常用的有
Typedef enum_D3DTEXTUREOP{
D3DTOP_DISABLE=1,
D3DTOP_SELECTARG1=2,
D3DTOP_SELECTARG2=3,
D3DTOP_MODULATE=4,
D3DTOP_ADD=7,
D3DTOP_SUBTRACT=10,
D3DTOP_BLENDDIFFUSEALPHA=12,
}D3DTEXTUREOP;
D3DTOP_DISABLE

关闭本层纹理Stage的输出。注意的是,在Color通道操作时不能关闭Alpha通道。

D3DTOP_SELECTARG1,D3DTOP_SELECTARG2

选定Arg的Color通道或Alpha通道。与D3DTSS_COLOROP配合时影响到Arg的Color通道,与D3DTSS_ALPHAOP配合时影响Arg的Alpha通道。

D3DTOP_MODULATE2006520232628447.jpg

将Arg1与Arg2参数相乘。Color和Alpha进入Arg时都是小数,而2个小数相乘会变小,所以这个操作的效果类似于AlphaZero的黑烟效果。

D3DTOP_ADD2006520232629117.jpg

将Arg1与Arg2参数相加。可以做出火焰,强光等的类似AlphaOne的混合效果

D3DTOP_BLENDDIFFUSEALPHA2006520232629439.jpg

将Arg1与Arg2使用Alpha值进行线性插值。这是标准的Alpha混合效果。

纹理参数常数TextureArgumentConstants同样可以设置到Value里

D3DTA_CURRENT

       表示上一个Stage混合的结果。Stage=0时,这个值表示的是D3DTA_DIFFUSE

D3DTA_DIFFUSE

       D3D在高路德(Gouraud)平滑渲染时会将多个顶点的diffuse颜色进行插值后返回。

如果顶点没有颜色,默认的是白色。

D3DTA_TEXTURE

       取自纹理颜色。

实例分析

2006520232629611.jpg

//TextureStage0
pd3dDevice->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_SELECTARG1);
pd3dDevice->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);
pd3dDevice->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_DISABLE);

将纹理的颜色不动的给下一层。

//TextureStage1
pd3dDevice->SetTextureStageState(1,D3DTSS_COLOROP,D3DTOP_BLENDDIFFUSEALPHA);
pd3dDevice->SetTextureStageState(1,D3DTSS_COLORARG1,D3DTA_TEXTURE);
pd3dDevice->SetTextureStageState(1,D3DTSS_COLORARG2,D3DTA_CURRENT);
pd3dDevice->SetTextureStageState(1,D3DTSS_ALPHAOP,D3DTOP_DISABLE);

将纹理的的颜色和上次的颜色进行普通ALPHA渲染

//TextureStage2
pd3dDevice->SetTextureStageState(2,D3DTSS_COLOROP,D3DTOP_ADD);
pd3dDevice->SetTextureStageState(2,D3DTSS_COLORARG1,D3DTA_DIFFUSE);
pd3dDevice->SetTextureStageState(2,D3DTSS_COLORARG2,D3DTA_CURRENT);
pd3dDevice->SetTextureStageState(2,D3DTSS_ALPHAOP,D3DTOP_DISABLE);

将D3D顶点的DIFFUSE颜色和上次的颜色层进行相加。

顶点颜色:0x444444ff

经验之谈

●纹理渲染的一般步骤是
1.       载入纹理
2.       构建顶点坐标,设置顶点Diffuse颜色
3.       将纹理使用SetTexture设置到相应Stage,D3DTA_TEXTURE指的就是当前Stage被设置的纹理。
4.       渲染
5.       如果有其他多边形要渲染时必须把各Stage的混合器的各通道关闭。
●使用2层以上纹理时必须加上m_pd3dDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 0);将纹理配合调节的和上一层相同。
●一些D3D中需要注意的细节。默认时8个渲染Stage是关闭的,设置后才会生效,用多少,开多少,不用的关闭。
●Direct3D9里开始使用Effect技术,这是和HLSL配套的,使用fx文件可以通过外部脚本方便的设置硬件渲染状态。同样,在学习纹理渲染时使用Effect技术也是非常方便快捷的。
●在DXSDK里,有一个纹理工具,可以实时的设置渲染纹理状态,这个工具同样是很方便的。

徐波
SunicEntertainment 2004
msn:sunicdavy@sina.com
BLOG:http://blog.gameres.com/show.asp?BlogID=182&column=0

参考:
DirectX9b SDK Documents
3D地形多层纹理混合加阴影渲染方法 Dolaham  www.GameRes.com
dx9_effect_simple    Kevin Harris www.CodeSampler.com
MultiTextureSample TheTutor  www.Gametutorials.com
SunicEntertainment 2004年个人射击游戏力作

战魂3 终极领域

游戏下载

http://gd.91.com/Modules/e65ca124-e9f7-4413-923d-8b06b1ba3e4e.htm

2006520232629347.gif

posted on 2011-07-18 23:31 yacper 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/yacper/archive/2011/07/18/2110086.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值