龙书dx9 纹理

本章Cube例子与前面不同;使用了规范的类定义。

笔记一:头文件中class  const static成员变量的问题:

vertex.h:

struct VertexT
{
    VertexT(){}
    VertexT(float x,float y,float z,float nx,float ny,float nz,float u ,float v)
    {
        _x = x;_y = y;_z=z;
        _nx = nx; _ny = ny ; _nz = nz;
        _u=u;_v=v;
    }
    float _x,_y,_z;
    float _nx,_ny,_nz;
    float _u,_v;
    static const DWORD FVFT;
};
//const DWORD VertexT::FVFT= (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1);//方式2
//#define  Vertex_FVF (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1)//方式1
#endif // !__vertexH__

例子里给的是方式1; 当我使用方式2的时候出现链接错误,error link1169 多个重定义的符号

然后我在vertex.cpp里进行定义,正确:

#include "vertex.h"
const DWORD VertexT::FVFT= (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1);


注意:1.不要试图在头文件.h里定义变量(除了extern全局外) 2.定义在.h的static变量,在不同cpp文件内,由于static的局部性,每个cpp内都会开辟自己的static变量;比如我在a.h里定义了static int a=0;在b.cpp、c.cpp里#include a.h ;那么,b.cpp和c.cpp里的static a变量没有任何关系。

参考:http://bbs.csdn.net/topics/390720572?page=1

3.编译是把源码变成机器指令;预编译只是代码间的处理;#include预编译;作用是把文件内容复制到当前;static 关键字在编译时申请静态空间

4.#ifndef #endif 只是防止预编译时的相同头文件的重复复制而已;

 

笔记二:纹理的mipmaps和filter

原因:纹理的大小和屏幕三角形大小不一致。

首先,建立mipmaps链,设定不同纹理等级,选取等级,确定我需要的纹理; 其次,通过设定的filter方式,来进行纹理与屏幕三角的匹配

比如:

 Device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);//第三步
 Device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);//第二步 纹理被缩小
 Device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);//第一步

纹理为:256*256建立mipmaps链:128*128,64*64,32*32... 假如三角形是100*100级别;
根据第一步:mipmap filter设置的是D3DTEXF_POINT(最近选择方式),现在选择128*128;纹理在根据第二步,多个纹理单元对应一个三角单元,D3DTEXF_LINEAR线性纹理过滤方式;每个三角形像素对最接近他的2*2纹理点进行采样;并取平均值;

参考:http://blog.csdn.net/kkk328/article/details/7055934

疑问:但我不清楚,如果是纹理放大模式(第三步),D3DTEXF_LINEAR模式,这时候一个纹理单元对应多个像素点,怎么进行选取纹理2*2取均值呢?

 

笔记三:纹理的四种寻址模式,

原因:纹理坐标可以超出1的范围,比如vertex中uv坐标在0到3之间。

几种模式:wrap(环绕)  、border边框模式(可自己设置)、clamp(截取(截取纹理在0到1范围内,并延伸边缘色))、mirror模式

 

posted @ 2014-12-07 00:25  dust_fly  阅读(539)  评论(0编辑  收藏  举报