Copyright © MikeFeng QQ: 76848502
多重纹理MultiTexture:使用多张纹理来渲染一个场景,只调用一次(DrawPrimitive)
纹理混合TextureBlending:按要求混合在同一个位置的像素点上色彩或透明度
在多重纹理(multitexturing)出现之前,DirectX支持的是多次渲染(multipass rendering)。但是因为OnFrameRender中要进行多次渲染(即Draw*的调用),效率很低。自从显卡开始支持多重纹理之后,游戏的性能得到了很大的提升:因为多重纹理只渲染一次,而在渲染之前通过调用SetTexture和SetTextureStageState函数来对不同的纹理进行混合,这个过程就叫做纹理混合(texture blending)。
多重纹理在pixel shader出现之前有着广泛的应用,主要可以用在以下方面:
①
黑暗映射:将两张纹理颜色相乘,模拟弱光照射
②
纹理和材质漫反射的混合:模拟强光照射
③
①②效果累加:(光的颜色*墙壁纹理)*黑暗贴图
④
发光映射:将两张纹理颜色相加
⑤
细节映射
⑥
Alpha操作,分为材质alpha和贴图alpha操作
在执行多纹理操作之前必须对显卡能力进行检查,Caps中与纹理和alpha操作有关的是:
l
MaxSimultaneousTextures
多纹理最大支持数
l
DestBlendCaps alpha
混合
l
SrcBlendCaps
对于源色彩混合的支持
l
TextureOpCaps
对于各种纹理映射的支持
l
TextureAddressCaps
对于寻址模式的支持
Example 1 Multipass Rendering + Material Alpha Blending
D3DX系列函数中有些是内建生成mesh的,例如D3DXCreateTeapot,就可以生成一个茶壶的mesh。Mesh俗称网格,在D3D中就是很多顶点定义的集合。D3DXCreateTeapot就可以生成一个茶壶顶点的集合。在以后的章节中会详细讲到mesh。在这里这样使用mesh就行了:
IDirect3DDevice9
* m_device;
ID3DXMesh
* m_teapot
V_RETURN
( D3DXCreateTeapot( m_device, &m_teapot, NULL) );
m_teapot
->DrawSubset(NULL);
这个例子中调用了两次Draw*,分别画背景和茶壶。背景类是一张纹理,渲染过程和以前类似。茶壶类如下:
class
Teapot
{
public
:
Teapot
(IDirect3DDevice9* device);
HRESULT
OnResetDevice
();
VOID
OnLostDevice
();
VOID
Create
();
VOID
OnFrameRender
( D3DMATERIAL9* mtrl, IDirect3DTexture9* tex );
~
Teapot
();
private
:
D3DMATERIAL9
m_mtrl
;
IDirect3DDevice9
* m_device;
ID3DXMesh
* m_teapot;
};
Teapot
::Teapot(IDirect3DDevice9* device)
{
m_device
=
device
;
}
Teapot
::~Teapot()
{
}
inline
VOID
Teapot
::Create()
{
m_mtrl
.Ambient = D3DXCOLOR(1,0,0,0);
m_mtrl
.Diffuse = D3DXCOLOR(1,0,0,0.3f);
m_mtrl
.Specular = D3DXCOLOR(1,0,0,0);
m_mtrl
.Emissive = D3DXCOLOR(1,0,0,0);
m_mtrl