为啥在D3D9里面调用SetTransform时就没法显示Texture?
大家好!
我在开发过程中,遇到这样一个问题,如果我用#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE|D3DFVF_TEX1),则Texture完全可以显示,一点问题都没有。
不过当我想实现用键盘左右键来控制Texture可以向左移动/向右移动时,却发现Texture没有在D3D9的程序中显示。代码如下,这是为啥?还请赐教。
struct CUSTOMVERTEX
{
FLOAT x, y, z;
D3DCOLOR color;
FLOAT tu, tv;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1)
HRESULT CGraphicAPIDX9::CreateTexture()
{
assert(m_pTexture == NULL && m_pVB == NULL && m_pIndexVB == NULL);
// 创建纹理
if(FAILED(m_pDevice->CreateTexture(uiDefaultWidgetContentWidth, uiDefaultWidgetContentHeight, 1, D3DUSAGE_DYNAMIC,
D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &m_pTexture, NULL)))
{
MessageBox(NULL, L"DX9 创建动态纹理失败!", L"XXX", MB_OK);
SAFE_RELEASE(m_pTexture);
return E_FAIL;
}
// 顶点索引
unsigned short MyRectTriList[] =
{
0, 1, 2,
2, 1, 3
};
// 顶点位置
float fStartX,fStartY;
fStartX = 100;
fStartY = 100;
float fWidth, fHeight;
fWidth = uiDefaultWidgetContentWidth - 1.0;
fHeight = uiDefaultWidgetContentHeight - 1.0;
// 顶点位置
CUSTOMVERTEX MyRectVertex[4] =
{
{ 0.0f, 0.0f, 0.0f, 0xffffffff, 0.0f, 0.0f }, // x, y, z, rhw, color, u, v
{ fWidth, 0.0f, 0.0f, 0xffffffff, 1.0f, 0.0f },
{ 0.0f, fHeight, 0.0f, 0xffffffff, 0.0f, 1.0f },
{ fWidth, fHeight, 0.0f, 0xffffffff, 1.0f, 1.0f }
};
if( FAILED(m_pDevice->CreateIndexBuffer(sizeof(MyRectTriList), D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &m_pIndexVB, NULL)))
{
SAFE_RELEASE(m_pIndexVB);
return E_FAIL;
}
if(FAILED(m_pDevice->CreateVertexBuffer(sizeof(MyRectVertex), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &m_pVB, NULL ) ) )
{
SAFE_RELEASE(m_pVB);
return E_FAIL;
}
VOID* pVertices;
if(FAILED(m_pVB->Lock( 0, sizeof(MyRectVertex), (void**)&pVertices, 0)))
{
SAFE_RELEASE(m_pVB);
return E_FAIL;
}
memcpy( pVertices, MyRectVertex, sizeof(MyRectVertex) );
m_pVB->Unlock();
VOID* pIndexVertices;
if(FAILED(m_pIndexVB->Lock( 0, sizeof(MyRectTriList), (void**)&pIndexVertices, 0)))
{
SAFE_RELEASE(m_pIndexVB);
return E_FAIL;
}
memcpy( pIndexVertices, MyRectTriList, sizeof(MyRectTriList) );
m_pIndexVB->Unlock();
return S_OK;
}
void CGraphicAPIDX9::Render()
{
m_pDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0, 45, 50, 170), 1.0f, 0);
// Render the scene
if( SUCCEEDED(m_pDevice->BeginScene() ))
{
if((m_pVB != NULL) && (m_pIndexVB != NULL) && (m_pTexture != NULL))
{
//World Transformation
D3DXMATRIXA16 mat;
mat._11 = 1.00f; mat._12 = 0.00f; mat._13 = 0.00f; mat._14 = 0.00f;
mat._21 = 0.00f; mat._22 = 1.00f; mat._23 = 0.00f; mat._24 = 0.00f;
mat._31 = 0.00f; mat._32 = 0.00f; mat._33 = 1.00f; mat._34 = 0.00f;
mat._41 = 0.00f; mat._42 = 0.00f; mat._43 = 0.00f; mat._44 = 1.00f;
m_pDevice->SetTransform(D3DTS_WORLD, &mat);
D3DXVECTOR3 vEyePt( 0.0f, 0.0f, 5.0f );
D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );
D3DXMATRIXA16 matView;
D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
m_pDevice->SetTransform( D3DTS_VIEW, &matView );
D3DXMATRIXA16 matProj;
D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
m_pDevice->SetTransform( D3DTS_PROJECTION, &matProj );
m_pDevice->SetTexture(0, m_pTexture);
m_pDevice->SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);
m_pDevice->SetStreamSource(0, m_pVB, 0, sizeof(CUSTOMVERTEX));
//Sets the current vertex stream declaration. Flexible Vertex Format. Called SetVertexShader() in DX8
m_pDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
m_pDevice->SetIndices(m_pIndexVB);
m_pDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 4, 0, 2);
}
m_pDevice->EndScene();
}
}