本章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的范围。
几种模式:wrap(环绕) 、border边框模式(可自己设置)、clamp(截取(截取纹理在0到1范围内,并延伸边缘色))、mirror模式