• 热门专题

游戏开发基础(六)

作者:mmzsyx的专栏  发布日期:2012-01-16 21:18:56
Tag标签:游戏开发  
  • 第六章
    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来设定与该物体关联的纹理


     

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规