MFC程序集成Direct3D的问题

penfe 2008-10-15 03:45:20
大家好,我实现了一个类AView,想把Direct3D集成到MFC程序里,实现如下,然后在MyView: public CView, AView里的OnDraw()调render()函数,在OnInitialUpdate里调create和fillVB,结果只有背景被刷成想要的白色,但三角形却没有出来。请大家帮我看一下,问题出在哪里呢?谢谢。


bool AView::create(HWND hwnd, int width, int height, bool windowed)
{
// Create the D3D object.
if( NULL == ( m_pD3d = Direct3DCreate9( D3D_SDK_VERSION ) ) )
return E_FAIL;

// Set up the structure used to create the D3DDevice
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof( d3dpp ) );
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

// Create the D3DDevice
if( FAILED( m_pD3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &m_pDevice ) ) )
{
return E_FAIL;
}

// Device state would normally be set here

return true;
}

bool AView::fillVB()
{

// Initialize three vertices for rendering a triangle
CUSTOMVERTEX vertices[] =
{
{ 150.0f, 50.0f, -0.5f, 1.0f, 0xffff0000, }, // x, y, z, rhw, color
{ 250.0f, 250.0f, -0.5f, 1.0f, 0xff00ff00, },
{ 50.0f, 250.0f, -0.5f, 1.0f, 0xff00ffff, },
};

// Create the vertex buffer. Here we are allocating enough memory
// (from the default pool) to hold all our 3 custom vertices. We also
// specify the FVF, so the vertex buffer knows what data it contains.
if( FAILED( m_pDevice->CreateVertexBuffer( 3 * sizeof( CUSTOMVERTEX ),
0, D3DFVF_CUSTOMVERTEX,
D3DPOOL_DEFAULT, &m_pVB, NULL ) ) )
{
return E_FAIL;
}

// Now we fill the vertex buffer. To do this, we need to Lock() the VB to
// gain access to the vertices. This mechanism is required becuase vertex
// buffers may be in device memory.
VOID* pVertices;
if( FAILED( m_pVB->Lock( 0, sizeof( vertices ), ( void** )&pVertices, 0 ) ) )
return E_FAIL;
memcpy( pVertices, vertices, sizeof( vertices ) );
m_pVB->Unlock();

return true;
}

bool AView::clean()
{
if( m_pDevice != NULL )
m_pDevice->Release();

if( m_pD3d != NULL )
m_pD3d->Release();

if (NULL != m_pVB)
m_pVB->Release();

return true;
}
bool AView::render()
{
if( NULL == m_pDevice )
return false;

// Clear the backbuffer to a white color
m_pDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 255, 255, 255 ), 1.0f, 0 );

// Begin the scene
if( SUCCEEDED( m_pDevice->BeginScene() ) )
{
// Rendering of scene objects can happen here
m_pDevice->SetStreamSource( 0, m_pVB, 0, sizeof( CUSTOMVERTEX ) );
m_pDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
m_pDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );
// End the scene
m_pDevice->EndScene();
}

// Present the backbuffer contents to the display
m_pDevice->Present( NULL, NULL, NULL, NULL );

return true;
}
...全文
487 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
王晓斌 2009-08-10
  • 打赏
  • 举报
回复
在OnSize里设置一下Camera和Frustum试试
jameshooo 2009-07-29
  • 打赏
  • 举报
回复
D3D居然能用在BeginPaint和EndPaint中间?
sandy_zc_1 2009-07-29
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 tkminigame 的回复:]
{ 150.0f, 50.0f, -0.5f, 1.0f, 0xffff0000, }, // x, y, z, rhw, color
{ 250.0f, 250.0f, -0.5f, 1.0f, 0xff00ff00, },
{ 50.0f, 250.0f, -0.5f, 1.0f, 0xff00ffff, },


f是表示浮点的吧,double要去掉f。[/Quote]

这个根本不是问题。编译器会自动将float转换成double的。
问题的关键在于FVF指明了要求使用32位float数据,而不是64位double数据。
因此你采用double来描述顶点格式只会让显卡对其进行错误的解释,从而导致渲染异常。
carrera007 2009-07-29
  • 打赏
  • 举报
回复
http://blog.csdn.net/carrera007/archive/2009/02/04/3861989.aspx
mmxpp 2009-07-11
  • 打赏
  • 举报
回复

mark
tkminigame 2009-07-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 penfe 的回复:]
多谢了。

Silenker,我也是参考这个文章来做的。不过没有打算animation.所以也没有调用OnEraseBkgnd。
问题出在我定义的CUSTOMVERTEX,我本来是double类型的,改成float类型的就好了。真奇怪。。。其他啥都没改。


C/C++ codestruct CUSTOMVERTEX
{
float x, y, z, rhw; // The transformed position for the vertex
DWORD color; // The vertex color
};
[/Quote]

{ 150.0f, 50.0f, -0.5f, 1.0f, 0xffff0000, }, // x, y, z, rhw, color
{ 250.0f, 250.0f, -0.5f, 1.0f, 0xff00ff00, },
{ 50.0f, 250.0f, -0.5f, 1.0f, 0xff00ffff, },


f是表示浮点的吧,double要去掉f。
sandy_zc_1 2009-07-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 penfe 的回复:]
多谢了。

Silenker,我也是参考这个文章来做的。不过没有打算animation.所以也没有调用OnEraseBkgnd。
问题出在我定义的CUSTOMVERTEX,我本来是double类型的,改成float类型的就好了。真奇怪。。。其他啥都没改。

[/Quote]

这肯定了,虽然说是灵活顶点格式,但是也不是灵活到任何数据类型都可以用的地步。
DX文档里面要求位置、法线、纹理坐标等顶点格式成员全部是float,而颜色成员全部是DWORD。

至于这些成员哪些要用哪些不用你可以自由组合,但是必须在D3DFVF_CUSTOMVERTEX这个常量中给出对应的标志,好让DX知道你是怎么组合的。
xqhrs232 2009-07-09
  • 打赏
  • 举报
回复
好东西,学习了
Mangafan 2008-10-24
  • 打赏
  • 举报
回复
最近关于DirectX的贴子实在是少的可怜,本人也正在查资料中,帮顶一个:)
palmax 2008-10-16
  • 打赏
  • 举报
回复
AView::OnEraseBkgnd 直接return TRUE
penfe 2008-10-16
  • 打赏
  • 举报
回复
多谢了。

Silenker,我也是参考这个文章来做的。不过没有打算animation.所以也没有调用OnEraseBkgnd。
问题出在我定义的CUSTOMVERTEX,我本来是double类型的,改成float类型的就好了。真奇怪。。。其他啥都没改。

struct CUSTOMVERTEX
{
float x, y, z, rhw; // The transformed position for the vertex
DWORD color; // The vertex color
};
wgm001 2008-10-16
  • 打赏
  • 举报
回复
帮顶...
VsirSoft 2008-10-16
  • 打赏
  • 举报
回复
up 路过 D3D不熟
引力场变动源 2008-10-15
  • 打赏
  • 举报
回复
然后Render最好是写在重载的CWinApp::OnIdle()里面。

一篇英文的参考文章:
Using Direct3D with MFC
http://www.cs.wisc.edu/~tlabonne/d3dmfc.html
引力场变动源 2008-10-15
  • 打赏
  • 举报
回复
View::OnEraseBkgnd()函数直接返回FALSE,不然的话,D3D的渲染会被覆盖掉。

19,464

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧