direct3D学习笔记(4)

2019-03-09 20:49

float(m_nWidth)/float(m_nHeight),//in]纵横比,在视空间宽度除以高度 );

最后,可以用三句话来概括这些变换的作用:世界变换决定实体的位置;视角变换决定

1.0f,

//[in]近裁剪面位置Z值 //[in]远裁剪面位置Z值

10000.0f

观察者的位置;投影变换决定观察者的可视区域。

图形绘制

//*设置资源流

HRESULT SetStreamSource( UINT StreamNumber, //渲染数据流序号

IDirect3DVertexBuffer9 *pStreamData, //进行绑定的顶点缓冲区指针 UINT OffsetInBytes, //进行绑定连接的渲染数据流的起始位置 的起始位置

UINT Stride //渲染数据流中一个顶点所占的内存的大小 );

//*设置顶点格式 HRESULT SetFVF( DWORD FVF //灵活顶点格式 );

D3D 定义的FVF 格式:

D3DFVF_XYZ //包含未经变换的顶点坐标 D3DFVF_XYZRHW //包含经过变换的顶点坐标 D3DFVF_XYZW //包含经过变换和裁剪的顶点坐标 D3DFVF_NORMAL //包含法线信息 D3DFVF_PSIZE //点精灵的大小

D3DFVF_DIFFUSE //包含漫反射的颜色信息 D3DFVF_SPECULAR //包含镜面反射的颜色信息

D3DFVF_TEX0……D3DFVF_TEX8 //包含0-8 个纹理坐标信息

D3DFVF_XYZB1……D3DFVF_XYZB5 //包含顶点位置信息和影响顶点变换的权重信息,用于骨骼动画模型中 //*绘制基本图元

HRESULT DrawPrimitive(

D3DPRIMITIVETYPE PrimitiveType, //绘制的图元类型 UINT StartVertex, //绘制的起始顶点 UINT PrimitiveCount //绘制的图元数量 );

//第一个参数PrimitiveType 取值:

D3DPT_POINTLIST //点列集合(一组点的集合) D3DPT_LINELIST //线列集合(一组线段的集合) D3DPT_LINESTRIP //线带集合(首尾相连的线段的集合) D3DPT_TRIANGLELIST //三角形列(一组三角形的集合)

D3DPT_TRIANGLESTRIP //三角形带(首尾相连的三角形,有两个顶点重合) D3DPT_TRIANGLEFAN //三角形扇(组成扇形的一组三角形) //图形绘制

HRESULT SetIndices(

IDirect3DIndexBuffer9 *pIndexData //使用的索引缓冲区指针 );

HRESULT DrawIndexedPrimitive(

D3DPRIMITIVETYPE Type, //基本图元类型

INT BaseVertexIndex, //顶点缓冲区的起始位置 UINT MinIndex, //相对于BaseVertexIndex 的最小索引 UINT NumVertices, //绘制的顶点数目,第一个顶点的位置 UINT StartIndex, //索引缓冲区的起始位置 UINT PrimitiveCount //绘制的基本图元数量 );

HRESULT IDirect3DDevice::Present ( CONST RECT* pSourceRect, CONST RECT* pDestRect, HWND hDestWindowOverride, CONST* pDirtyRegion

//复制源的矩形区域指针 //复制目标的矩形区域指针 //Direct3D设备所属窗口句柄 //最小更新区域指针

);

纹理

//从磁盘文件获取纹理 //该函数支持的图形文件类型: bmp、dds、dib、jpg、png 以及tga 等

HRESULT WINAPI D3DXCreateTextureFromFile( LPDIRECT3DDEVICE9 pDevice, //Direct3D 设备指针 LPCTSTR SrcFile, );

//设置当前要渲染的纹理

//纹理图形文件

LPDIRECT3DTEXTURE9 *ppTexture //存储Direct3D 纹理的指针地址

HRESULT SetTexture(

DWORD Stage, //多级纹理的索引,从0-7,单层纹理取0 IDirect3DBaseTexture9 *pTexture //Direct3D 的纹理接口指针 );

//设置纹理的渲染状态

HRESULT SetTextureStageState(

DWORD Stage, //当前设置的多级纹理的索引

D3DTEXTURESTAGESTATETYPE Type, //纹理渲染状态的类型 DWORD Value //纹理渲染状态的值,与类型相对应 );

//第二个参数D3DTEXTURESTAGESTATETYPE Type 取值: typedef enum _D3DTEXTURESTAGESTATETYPE {

D3DTSS_COLOROP = 1, //纹理层的颜色混合方式,即运算方式 D3DTSS_COLORARG1 = 2, //颜色混合的第一个参数 D3DTSS_COLORARG2 = 3, //颜色混合的第二个参数 D3DTSS_ALPHAOP = 4, //指定纹理层的Alpha 透明 D3DTSS_ALPHAARG1 = 5, //Alpha 混合的第一个参数 D3DTSS_ALPHAARG2 = 6, //Alpha 混合的第二个参数 D3DTSS_BUMPENVMAT00 = 7, //绘制凹凸纹理时 D3DTSS_BUMPENVMAT01 = 8, //绘制凹凸纹理时 D3DTSS_BUMPENVMAT10 = 9, //绘制凹凸纹理时

D3DTSS_BUMPENVMAT11 = 10, //绘制凹凸纹理时

D3DTSS_TEXCOORDINDEX = 11, //该纹理层使用的纹理坐标的索引 D3DTSS_BUMPENVLSCALE = 22, //绘制凹凸纹理的缩放参数 D3DTSS_BUMPENVLOFFSET = 23, //绘制凹凸纹理的平移参数

D3DTSS_TEXTURETRANSFORMFLAGS = 24, //控制纹理坐标的转换标志 D3DTSS_COLORARG0 = 26, //指定混合过程的第三个颜色 D3DTSS_ALPHAARG0 = 27, //Alpha 混合的第三个参数 D3DTSS_RESULTARG = 28, //颜色混合的结果输出寄存器 D3DTSS_CONSTANT = 32, //颜色混合的常量寄存器

D3DTSS_FORCE_DWORD = 0x7fffffff //强制转换为32 位,用于占位 } D3DTEXTURESTAGESTATETYPE; //设置纹理采样属性

HRESULT SetSamplerState(

DWORD Sampler, //指定纹理采样属性的纹理层ID(0~7) D3DSAMPLERSTATETYPE Type, //纹理过滤类型 DWORD Value //设置纹理采样属性值 );

第二个参数D3DSAMPLERSTATETYPE Type 取值: D3DSAMP_MAGFILTER //处理放大过滤 D3DSAMP_MINFILTER //处理缩小过滤 D3DSAMP_MIPFILTER //多纹理过滤

D3DSAMP_MIPMAPLODBIAS //多级纹理级数偏移值,初始值为0 D3DSAMP_MAXMIPLEVEL //最大多纹理级别,初始值为0 D3DSAMP_MAXANISOTROPY //各向异性,初始为1 第三个参数Value 取值:

D3DTEXF_NONE //不使用特殊的采样方式 D3DTEXF_POINT //最近点采样 D3DTEXF_LINEAR //线性纹理采样

D3DTEXF_ANISOTROPIC //各向异性纹理采样

最近点采样

最近点采样是4种过滤方式中速度最快但效果最差的过滤方式。Direct3D计算得到的纹理元素地址通常是一个浮点数值,而非整数的纹理下标值,当使用最近点采样时,Direct3D会复制与这个浮点值地址最接近的整数地址的纹理元素的颜色。

设置最近点采样的具体方法如下:调用IDirect3DDevice9::SetSamplerState(),可分别

设置纹理过滤的放大过滤器和缩小过滤器。将第一个参数设置为纹理过滤器关联的纹理层序号(0~7)。如果要设置放大过滤器,第二个参数设为D3DSAMP_MAGFILTER,如果要设置缩小过滤器,第二个参数设为D3DSAMP_MINFILTER。第三个参数可设为表示最近点采样的枚举常量D3DTEXF_POINT。下列代码将纹理层0的纹理过滤方式设置为最近点采样。 g_device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT); g_device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT);

如果纹理的大小和屏幕图元的实际大小将近,那么采用最近点采样方法对图像质量的影响不大。但是,如果大小相差太多,就会降低图像精度,从而影响图像质量,出现色块或闪烁的失真现象。

线性纹理过滤

线性纹理过滤是目前使用最广泛的纹理过滤方法。它与最近点采样相比,能有效地提高图像的显示质量,并且对系统性能影响不大。线性纹理过滤取得与计算得到的纹理元素的浮点地址最接近的上、下、左、右4个纹理元素,对这4个纹理元素进行加权平均,得到最终显示的颜色值。

与设置最近点采样的方法相似,调用函数IDirect3DDevice9::SetSamplerState()设置线性纹理过滤,所不同的是第三个参数设置为D3DTEXF_LINEAR。

下面的代码将纹理层0的放大和缩小过滤器设置为线性纹理过滤。 g_device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); g_device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);

因为是在单一纹理层上的线性过滤,而且是x、y方向上的线性过滤,所以称为双线性纹理过滤。目前大多数显卡都为线性纹理过滤进行了优化,所以使用线性纹理过滤一方面可以获得较好的图形质量,另一方面对程序性能影响不大。

各项异性纹理过滤

当三维物体表面与投影平面不平行时,它在屏幕上的投影会有拉长或扭曲,这种现象称为各项异性(anisotropy)。当一个各向异性图元的像素映射到纹理元素时,它的形状发生扭曲。Direct3D根据屏幕像素反向转换到纹理元素的延长度,决定各项异性程度。

要使用各项异性纹理过滤,还应当设置最大各项异性程度值。通过将函数IDirect3DDevive9::SetSamplerState()的第一个参数设为纹理层索引,第二个参数设为D3DSAMP_MAXANISOTOPY,第三个参数设为大于1的任何值,可以完成最大各项异性程


direct3D学习笔记(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:德镇市2013年八年级下期中试卷及答案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: