游戏开发基础(六)

 

第六章
Direct3D中,纹理用接口IDirect3DTexture9来表示,纹理是类似于表面的一个像素矩阵,与表面不同的是它可被映射到三角形单元中
Direct3D所使用的纹理座标系由沿水平方向的u轴和沿垂直方向的v轴构成,用座标对(u,v)标识的纹理元素称为纹理元
注意v轴的正方向是竖直向下的
Direct3D将纹理座标做了规范化处理,使之限定在区间[0,1]内
D3DFVF_TEX1,顶点结构中包含了一对纹理座标
3D三角形已经被变换至屏幕座标系时,纹理映射才会进行

HRESULT D3DXCreateTextureFormFile(
    LPDIRECT3DDEVICE9 pDevice,
    LPCTSTR pSrcFile,
    LPDIRECT3DTEXTURE9* ppTexture
    );
设置当前纹理:
HRESULT IDirect3DDevice::SetTexture(
    DWORD Stage,
    IDirect3DBaseTexture9 *pTexture);
在Direct3D中,最多可设置8层纹理
若想禁用某一纹理层,可将pTexture参数设为0
例:绘制物体时若不想使用纹理
Device->SetTexture(0,0);
renderObjectWithoutTexture();
如果场景中各个三角形所使用的纹理均不相同:
Device->SetTexture(0,tex0);
drawTrisUsingTex0();
Device->SetTexture(0,tex1);
drawTrisUsingTex1();


Direct3D提供了3种类型的纹理过滤器,每种过滤器都提供了一种质量水平
纹理过滤方式可以IDirect3DDevice9->SetSamplerState来设置

#近点采样
将近点采样方式设置为放大过滤器和缩小过滤器
Device->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_POINT);
Device->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_POINT);
#线性纹理过滤
将线性纹理过滤设置为放大过滤器和缩小过滤器
Device->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
Device->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);
#各向异性纹理过滤
将各向异性纹理过滤设置为放大过滤器和缩小过滤器
Device->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_ANISOTROPIC);
Device->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_ANISOTROPIC);
使用各向异性纹理过滤时,必须对D3DSAMP_MAXANISOTROPIC水平值进行设定,该值决定了各向异性过滤的质量水平
用IDirect3DDevice9::GetDeviceCaps函数检查返回的D3DCAPS9结构参数,
Device->SetSamplerState(0,D3DSAMP_MAXANISOTROPIC,4);

多级渐进纹理
多级渐进纹理过滤器主要用于控制IDirect3D使用多级渐进纹理的方式,
可以对多级渐进纹理过滤器如下设置:
Device->SetSamplerState(0,D3DSAMP_MIPFILTER,Filter);
Filter值:
D3DTEXF_NONE 禁用多级渐进纹理过滤器
D3DTEXF_POINT 通过使用该过滤器,Direct3D将选择尺寸与屏幕三角形最接近的那一级纹理,一旦选择了某一纹理,Direct3D就会用指定

的放大过滤器和缩小过滤器对该级纹理进行过滤
D3DTEXF_LINEAR 通过使用该过滤器,Direct3D将取与屏幕三角形尺寸最接近的两个纹理级,用指定的放大过滤器和缩小过滤器对每级纹理

进行过滤,然后在将这两级纹理进行线性组合,从而形成最终的颜色值。


寻址模式
Direct3D定义了4种用来处理纹理座标值超出[0,1]区间的纹理映射模式,它们分别是:重复寻址模式,边界颜色寻址模式,箝位寻址模式

以及镜像寻址模式
重复寻址模式
Device->SetSampleState(0,D3DSAMP_ADDRESSU,D3DTADDRESS_WRAP);
Device->SetSampleState(0,D3DSAMP_ADDRESSV,D3DTADDRESS_WRAP);
边界颜色寻址模式
Device->SetSampleState(0,D3DSAMP_ADDRESSU,D3DTADDRESS_BORDER);
Device->SetSampleState(0,D3DSAMP_ADDRESSV,D3DTADDRESS_BORDER);
Device->SetSampleState(0,D3DSAMP_BORDERCOLOR,0x000000ff);
箝位寻址模式
Device->SetSampleState(0,D3DSAMP_ADDRESSU,D3DTADDRESS_CLAMP);
Device->SetSampleState(0,D3DSAMP_ADDRESSV,D3DTADDRESS_CLAMP);
镜像寻址模式
Device->SetSampleState(0,D3DSAMP_ADDRESSU,D3DTADDRESS_MIRROR);
Device->SetSampleState(0,D3DSAMP_ADDRESSV,D3DTADDRESS_MIRROR);

场景添加纹理的步骤:
1 构造组成物体的顶点,并为其指定纹理座标
2 用函数D3DXCreateTextureFromFile为IDirect3DTexture9接口加载一种纹理
3 设置缩小过滤器,放大过滤器和多级渐进纹理过滤器
4 绘制物体前,用函数IDirect3DDevice9::SetTexture来设定与该物体关联的纹理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章