Direct3D中自定义顶点的三种方式及贴图和变换处理

来源:互联网 发布:unity3d 虚拟现实漫游 编辑:程序博客网 时间:2024/05/12 05:48

格式1:

//定义顶点格式

struct Vertex

{

    Vertex(){}

    Vertex(float_x,float _y,float_z,float _w,float_u,float _v)

    {

         x=_x;y=_y;z=_z;w=_w;

         u=_u;v=_v;

    }

    floatx,y,z,w;    //顶点坐标

    float u,v;        //纹理坐标

};

#define D3DFVF_XYZRHW_TEX  D3DFVF_XYZRHW | D3DFVF_TEX1

 

说明:采用D3DFVF_XYZRHW格式来确定顶点的最终坐标位置,使用此标志后3D屏幕坐标是从“左上角(0,0)开始向左和下增加到屏幕宽和高”。但有个缺点就是,不可以用SetTransform(D3DTS_WORLD,&world);函数来进行坐标变换变换,如果想变换的话应该使用下面那样的方式来变换:

m_vertices[0].position=CUSTOMVERTEX::Position(width2*(1-cos(angle)),bottom,width2*sin(angle),w);

m_vertices[1].position=CUSTOMVERTEX::Position(width2*(1-cos(angle)),top,width2*sin(angle),w);

m_vertices[2].position=CUSTOMVERTEX::Position(width2*(1+cos(angle)),bottom,-1.0f*width2*sin(angle),w);

m_vertices[3].position=CUSTOMVERTEX::Position(width2*(1+cos(angle)),top,-1.0f*left*sin(angle),w);

【PS:适合对图片进行变换,得到3D效果】

 

格式2

//定义顶点格式

struct Vertex

{

    Vertex(){}

    Vertex(float_x,float _y,float_z ,float _u,float_v)

    {

         x=_x;y=_y;z=_z;

         u=_u;v=_v;

    }

    float x,y,z; //顶点坐标

    float u,v;        //纹理坐标

};

#define D3DFVF_XYZRHW_TEX  D3DFVF_XYZ | D3DFVF_TEX1   

 

说明:使用D3DFVF_XYZ” + “透视投影”方式表现3D空间中模型的变换,坐标系为“以屏幕中心为(0,0),想右和上增加,但都是小值,单位不是像素”。但这种的话,很不好确定屏幕中贴图的位置。因为,透视投影的话具有“摄像机位置”和“投影参数”,现在还不知道如何让一张贴图贴满整个屏幕,具体的顶点坐标应该为多少!但用这种方法可以很好的实现模型或者纹理图片的3D变换!【PS:适合对3D模型进行变换,不适合对图片进行变换】

贴图:满屏贴图的方法:

 

 

格式3:

//定义顶点格式

struct Vertex

{

    Vertex(){}

    Vertex(float_x,float _y,float_z ,float _u,float_v)

    {

         x=_x;y=_y;z=_z;

         u=_u;v=_v;

    }

    float x,y,z; //顶点坐标

    float u,v;        //纹理坐标

};

#define D3DFVF_XYZRHW_TEX D3DFVF_XYZ| D3DFVF_TEX1

 

说明:使用D3DFVF_XYZ” + “正交投影”方式表现3D空间中模型的变换,屏幕坐标系为“以屏幕中心为(0,0),向右和上增加,但单位为像素”!可以用SetTransform(D3DTS_WORLD,&world);来进行变换,但基本上得不到3D的效果,因为是“正交”方式,例如图片旋转的过程中根本不像3D效果,而是2D效果!

【PS:不适合进行3D变换】

 

原创粉丝点击