D3D加载纹理渲染

来源:互联网 发布:齐博cms模板 编辑:程序博客网 时间:2024/06/05 11:15

 class CIndexBufferTest
{
public:
 CIndexBufferTest(void);
 virtual ~CIndexBufferTest(void);
public:
 HRESULT D3DCreate( LPDIRECT3DDEVICE9 pd3dDevice );
 void Render( LPDIRECT3DDEVICE9 pd3dDevice );
 void SetMatrix( LPDIRECT3DDEVICE9 pd3dDevice );
private:
 IDirect3DVertexBuffer9* m_pVB;
 IDirect3DTexture9*      m_pTexture;
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////struct Vertex
{
 Vertex( 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; // texture coordinates
 static const DWORD FVF;
};
const DWORD Vertex::FVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1;

CIndexBufferTest::CIndexBufferTest(void)
{
 m_pVB = NULL;
 m_pTexture = NULL;
}

CIndexBufferTest::~CIndexBufferTest(void)
{
 SAFE_RELEASE( m_pVB );
 SAFE_RELEASE( m_pTexture );
}

HRESULT CIndexBufferTest::D3DCreate( LPDIRECT3DDEVICE9 pd3dDevice )
{
 if( FAILED( pd3dDevice->CreateVertexBuffer( 6 * sizeof(Vertex), D3DUSAGE_WRITEONLY, Vertex::FVF, D3DPOOL_MANAGED, &m_pVB, 0 ) ) )
  return E_FAIL;

 Vertex* v;
 m_pVB->Lock(0, 0, (void**)&v, 0);

 // quad built from two triangles, note texture coordinates:
 v[0] = Vertex(-1.0f, -1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f);
 v[1] = Vertex(-1.0f,  1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f);
 v[2] = Vertex( 1.0f,  1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f);

 v[3] = Vertex(-1.0f, -1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f);
 v[4] = Vertex( 1.0f,  1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f);
 v[5] = Vertex( 1.0f, -1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f);

 m_pVB->Unlock();

 if( FAILED( D3DXCreateTextureFromFile( pd3dDevice, L"Dwarf\\Body.dds", &m_pTexture ) ) )
  return E_FAIL;

 pd3dDevice->SetTexture( 0, m_pTexture );

 pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
 pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
 pd3dDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);

 //
 // Don't use lighting for this sample.
 //
 pd3dDevice->SetRenderState(D3DRS_LIGHTING, false);

 // 照相机位置(视图矩阵)
 D3DXVECTOR3 position(0.0f, 0.0f, -5.0f);
 D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);
 D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);
 D3DXMATRIX V;
 D3DXMatrixLookAtLH(&V, &position, &target, &up);

 pd3dDevice->SetTransform(D3DTS_VIEW, &V);

 D3DXMATRIX proj;
 D3DXMatrixPerspectiveFovLH(
  &proj,
  D3DX_PI * 0.5f, // 90 - degree
  1.0f,
  1.0f,
  1000.0f);
 pd3dDevice->SetTransform(D3DTS_PROJECTION, &proj);

 pd3dDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
 pd3dDevice->SetRenderState(D3DRS_LIGHTING, false);

 return S_OK;
}

void CIndexBufferTest::SetMatrix( LPDIRECT3DDEVICE9 pd3dDevice )
{
 D3DXMATRIX Rx, Ry;
 D3DXMatrixRotationX(&Rx, 3.14f / 4.0f);

 static float y = 0.0f;
 D3DXMatrixRotationY(&Ry, y);
 y += 0.01f;

 //当y轴旋转2周时,重新回到0弧度
 if( y >= 6.28f )
  y = 0.0f;

 D3DXMATRIX p = Rx * Ry;
 pd3dDevice->SetTransform(D3DTS_WORLD, &p);
}

void CIndexBufferTest::Render( LPDIRECT3DDEVICE9 pd3dDevice )
{
 SetMatrix( pd3dDevice );

 pd3dDevice->SetStreamSource(0, m_pVB, 0, sizeof(Vertex)); // 设置资源流
 pd3dDevice->SetFVF(Vertex::FVF); // 设置顶点格式
 pd3dDevice->SetTexture(0, m_pTexture);
 // 利用索引缓存绘制
 pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////HRESULT  D3DXCreateTextureFromFile //创建纹理
(
 LPDIRECT3DDEVICE9 pDevice, //有效的3D设置指针
 LPCTSTR pSreFile,  //图形文件的路径及文件名
 LPDIRECT3DTEXTURE9 *ppTexture //存储3D纹理的指针地址
);

HRESULT  SetTextrue   //指定纹理
(
 DWORD Stage,   //指定关联的纹理层
 IDirect3DBaseTextrue9 *pTexture //IDirect3D纹理接口指针
)

m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_POINT );//设置最近采样过滤
m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_POINT );

m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );//设置线性纹理过滤
m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );

m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC );//设置异性纹理过滤
m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_ANISOTROPIC );
m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MAXANISOTROPY, 4 );//需调用GetDeviceCaps()检测最大异性值


m_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP );//设置重叠纹理寻址
m_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP );

m_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_MIRROR );//设置镜像纹理寻址
m_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_MIRROR );

m_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP );//设置夹取纹理寻址
m_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP );

m_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER );//设置边框纹理寻址
m_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER );
m_pd3dDevice->SetSamplerState( 0, D3DTADDRESS_BORDER, 0xffff0000 );