|
|
在很多台电脑上实验 只有一台有问题 附件里左边是正常的显示 右边就是那台电脑的诡异显示 = =!?

这咋回事? 数据在渲染前点的位置和颜色都是正常的
经过N多排除测试偶发现个问题。。。但无法理解 问题就在把数据拷贝到VertexBuffer
有两种代码 一种可以正常显示颜色 而我的就不行
struct CUSTOMVERTEX
{
FLOAT x, y, z, rhw;
DWORD color;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE) //顶点格式
LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; //顶点缓冲区对象
CUSTOMVERTEX vertices[] = {... }; // 一个矩形坐标
VOID* pVertices;
if( FAILED( g_pVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 ) ) )
return E_FAIL;
memcpy( pVertices, vertices, sizeof(vertices) );
g_pVB->Unlock();
这种填充就能正常 我和他的区别就在于点的数据。。但我觉得应该是一样的。。
class CGI2DPoint
{
public:
CGI2DPoint( void );
~CGI2DPoint( void );
public:
enum{
FVF_FORMAT = D3DFVF_XYZRHW,
POINT_SIZE = sizeof( float ) * 4,
ENUM_FORCE_COMPILATION
};
public:
inline void Move( const float fOffsetX, const float fOffsetY )
{
GI2DPointMove( &m_fX, &m_fY, fOffsetX, fOffsetY );
}
inline void Scale( const float fScaleX, const float fScaleY )
{
GI2DPointScale( &m_fX, &m_fY, fScaleX, fScaleY );
}
inline void Rotate( const float fRadian )
{
GI2DPointRotate( &m_fX, &m_fY, fRadian );
}
inline void Rotate( const float fRadian, const float fCenterX, const float fCenterY )
{
GI2DPointRotate( &m_fX, &m_fY, fRadian, fCenterX, fCenterY );
}
inline void SetX( const float fX ) { m_fX = fX; }
inline float GetX( void ) { return ( m_fX ); }
inline void SetY( const float fY ) { m_fY = fY; }
inline float GetY( void ) { return ( m_fY ); }
inline void SetPos( const float fX, const float fY ) { m_fX = fX; m_fY = fY; }
private:
float m_fX;
float m_fY;
float m_fZ;
float m_fRhw;
};
class CGI2DDiffusePoint : public CGI2DPoint
{
public:
CGI2DDiffusePoint( void );
~CGI2DDiffusePoint( void );
public:
enum{
FVF_FORMAT = CGI2DPoint::FVF_FORMAT | D3DFVF_DIFFUSE,
POINT_SIZE = CGI2DPoint: OINT_SIZE + sizeof( dword ),
ENUM_FORCE_COMPILATION
};
public:
inline void SetColor( const dword dwColor ) { m_dwColor = dwColor; }
inline dword GetColor( void ) { return ( m_dwColor ); }
private:
dword m_dwColor;
};
CGI2DDiffusePoint *pData = new CGI2DDiffusePoint[ 4 ]
......//填充个矩形坐标
VOID* pVertices;
if( FAILED( g_pVB->Lock( 0, 4 * CGI2DDiffusePoint::POINT_SIZE, (void**)&pVertices, 0 ) ) )
return E_FAIL;
memcpy( pVertices, pData, 4 * CGI2DDiffusePoint::POINT_SIZE );
g_pVB->Unlock();
我这样在那台电脑上就成了附件右边的状态。。。。其他电脑都是正常。。。。
各位大大 到底咋回事 = = 内存里的东东都是一样的
创建没问题
if( FAILED( m_pDevice->CreateVertexBuffer( 4*sizeof(CUSTOMVERTEX),
0, D3DFVF_CUSTOMVERTEX,
D3DPOOL_MANAGED, &g_pVB, NULL ) ) )
{
return E_FAIL;
}
渲染也米问题
m_pDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
m_pDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
m_pDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );
配置:
系统是32位XP SP3




今天又发现了另一台电脑 笔记本 集成显卡
区别是不支持D3DCREATE_HARDWARE_VERTEXPROCESSING
只能用D3DCREATE_SOFTWARE_VERTEXPROCESSING
连QueryPerformanceFrequency都不支持。。
显示的方块是:

配置:
系统也是32位XP SP3



 |
|