D3D为啥我不用RHW格式就显示不了图片,而用了之后就可以?

nabasasun 2013-10-19 01:03:27

听说D3D RHW 移动和旋转不了图片 ,所以我决定修改,但是画面变黑暗

struct CUSTOMVERTEX
{
FLOAT x, y, z, rhw;
FLOAT u, v;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_TEX1)
//这个能正常显示



struct CUSTOMVERTEX
{
FLOAT x, y, z;
FLOAT u, v;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1)
//这个失败,画面一团黑色





g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX );
g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX ) );
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,2);
...全文
130 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
nabasasun 2013-10-21
  • 打赏
  • 举报
回复
引用 5 楼 jiangcaiyang123 的回复:
粗略看了一下,你定义了D3DFVF_CUSTOMVERTEX3但是使用的是D3DFVF_CUSTOMVERTEX。
修改的时候出错而已,但是原来的代码就是全都是D3DFVF_CUSTOMVERTEX3 。你可以忽略这个
彩阳 2013-10-21
  • 打赏
  • 举报
回复
粗略看了一下,你定义了D3DFVF_CUSTOMVERTEX3但是使用的是D3DFVF_CUSTOMVERTEX。
nabasasun 2013-10-20
  • 打赏
  • 举报
回复
引用 3 楼 jiangcaiyang123 的回复:
那看看你的数据是怎么样的呢。 我这里恰好有VS + DX9,你将所有代码制作成一个main.cpp文件贴出来测试测试。






struct CUSTOMVERTEX3
{
     FLOAT x, y, z;
     DWORD color;
     FLOAT u, v;        
};

#define D3DFVF_CUSTOMVERTEX3 (D3DFVF_XYZ|D3DFVF_DIFFUSE |D3DFVF_TEX1)






// 关闭光照
	g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );

 //加载纹理我擦!
if( FAILED( D3DXCreateTextureFromFileEx( g_pd3dDevice, "111.bmp",800,600,1,0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED,D3DX_DEFAULT,D3DX_DEFAULT, NULL,NULL,NULL,
&g_pTexture_bj) ) )
     {
             MessageBox(NULL, "Could not find 111.bmp", "fail", MB_OK);
             return E_FAIL;
     }






HRESULT InitVB()
{

	
	
 
 CUSTOMVERTEX vertices[] =  
	{

        { 0.0f,0.0f,0.0f,D3DCOLOR_XRGB(255,255,255),0.0f, 0.0f}, 
        { 800.0f,0.0f,0.0f,D3DCOLOR_XRGB(255,255,255),1.0f,0.0f},
        { 0.0f,600.0f,0.0f,D3DCOLOR_XRGB(255,255,255),0.0f,1.0f},
        { 0.0f,600.0f,0.0f,D3DCOLOR_XRGB(255,255,255),0.0f,1.0f}, 
        { 800.0f,0.0f,0.0f,D3DCOLOR_XRGB(255,255,255),1.0f,0.0f},
        { 800.0f,600.0f,0.0f,D3DCOLOR_XRGB(255,255,255),1.0f,1.0f},

	};





//顶点缓冲区
g_pd3dDevice->CreateVertexBuffer( 
		6*sizeof(CUSTOMVERTEX),             
		0, 
		D3DFVF_CUSTOMVERTEX, 
		D3DPOOL_DEFAULT, 
		&g_pVB,
		NULL 
		); 
	
	void* pVertices; //把顶点写进顶点缓冲区 
	g_pVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 ); 
	memcpy( pVertices, vertices, sizeof(vertices) ); 
	g_pVB->Unlock(); 


}



//正交投影

D3DXMatrixOrthoLH(&proj, 1280, 720, 0.1f, 1000.0f);
g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &proj);





//显示部分
g_pd3dDevice->SetTexture(0, g_pTex01 );
g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX );
g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,2);

这些都是关键部分
彩阳 2013-10-19
  • 打赏
  • 举报
回复
那看看你的数据是怎么样的呢。 我这里恰好有VS + DX9,你将所有代码制作成一个main.cpp文件贴出来测试测试。
nabasasun 2013-10-19
  • 打赏
  • 举报
回复
引用 1 楼 jiangcaiyang123 的回复:
看来你需要再看看书上对灵活顶点格式是如何定义的。 在Direct3D的内部根据你传入的FVF来对应不同的顶点缓存Handler。 #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1) 意思是让Direct3D处理带有xyz坐标、漫反射颜色和一纹理UV坐标的顶点,但是 struct CUSTOMVERTEX { FLOAT x, y, z; FLOAT u, v; }; 这里你漏掉了漫反射分量。 所以Direct3D内部数据读取错误而导致黑屏。
可我加了漫反射color还是不对啊
彩阳 2013-10-19
  • 打赏
  • 举报
回复
看来你需要再看看书上对灵活顶点格式是如何定义的。 在Direct3D的内部根据你传入的FVF来对应不同的顶点缓存Handler。 #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1) 意思是让Direct3D处理带有xyz坐标、漫反射颜色和一纹理UV坐标的顶点,但是 struct CUSTOMVERTEX { FLOAT x, y, z; FLOAT u, v; }; 这里你漏掉了漫反射分量。 所以Direct3D内部数据读取错误而导致黑屏。

19,468

社区成员

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

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