【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 3165|回复: 6

用D3DXSprite来显示图片不成功,郁闷

[复制链接]
发表于 2006-3-26 23:58:39 | 显示全部楼层 |阅读模式
实在是很痛苦(新手),用d3dsprite显示不出来,没有办法,不知道问题出在哪里 贴上代码,希望高手指教。 环境:VC6.0 + DX(不知道那个版本),已经无编译错误。 是全屏,黑漆漆的一片 #include #include #include #pragma comment(lib, "d3d9.lib") #pragma comment(lib, "d3dx9.lib") char* CatBMP = "cat.bmp"; //char* MouseBMP = "mouse.bmp"; RECT rct; HWND g_hWnd; HINSTANCE g_hInstance; LPDIRECT3D9 g_pD3D = NULL; LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; LPD3DXSPRITE g_pSprite = NULL; LPDIRECT3DTEXTURE9 g_pTexture = NULL; LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; struct CUSTOMVERTEX { float x, y, z, rhw; DWORD color; }; LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); bool InitWindow(HINSTANCE hInstance); bool InitDirect3D(); bool InitVB(); void Render(); void Cleanup(); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow ) { if (!InitWindow(hInstance)) return false; if (!InitDirect3D()) return false; if(!InitVB()) return false; // if(!SetupMouse()) // return false; // main message loop: MSG msg; ZeroMemory( &msg, sizeof( msg ) ); while(msg.message != WM_CLOSE) { if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage( &msg ); DispatchMessage( &msg ); } else Render(); } return (int) msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_KEYDOWN: switch(wParam) { case VK_ESCAPE: PostMessage(g_hWnd, WM_CLOSE, 0, 0); break; } break; case WM_CLOSE: Cleanup(); PostQuitMessage(0); return 0; break; } return DefWindowProc(hWnd,message,wParam,lParam); } bool InitWindow(HINSTANCE hInstance) { //注册窗口类略 g_hInstance = hInstance; // Create the window g_hWnd = CreateWindow ( "DirectXExample", "DirectXExample", WS_EX_TOPMOST | WS_POPUP | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, NULL, NULL, hInstance, NULL ); if (!g_hWnd) return false; // Display the window on the screen ShowWindow(g_hWnd, SW_SHOW); UpdateWindow(g_hWnd); return true; } bool InitDirect3D() { SetRect(&rct, 400, 400, 500, 500); //g_pD3D = NULL; //g_pd3dDevice = NULL; if((g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)) == NULL) return FALSE; D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.Windowed = FALSE; //d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; //d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8; d3dpp.BackBufferCount = 1; d3dpp.BackBufferWidth = 800; d3dpp.BackBufferHeight = 600; d3dpp.hDeviceWindow = g_hWnd; if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice))) return FALSE; if(FAILED(D3DXCreateSprite(g_pd3dDevice, &g_pSprite))) return FALSE; //D3DIMAGE_INFO imageinfo; if(FAILED(D3DXCreateTextureFromFile(g_pd3dDevice, CatBMP, &g_pTexture))) return FALSE; return TRUE; } bool InitVB() { CUSTOMVERTEX vertices[] = { {300.0, 300.0, 0, 0}, {400.0, 300.0, 0, 0}, {400.0, 400.0, 0, 0}, {300.0, 400.0, 0, 0} }; if(FAILED(g_pd3dDevice->CreateVertexBuffer(4*sizeof(CUSTOMVERTEX), 0, D3DFVF_XYZRHW | D3DFVF_DIFFUSE, D3DPOOL_DEFAULT, &g_pVB, NULL))) return false; VOID* pVertices; if(FAILED(g_pVB->Lock(0, 0, &pVertices, 0))) return false; memcpy(pVertices, vertices, sizeof(vertices)); g_pVB->Unlock(); return true; } void Render() { g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1, 0); if(SUCCEEDED(g_pd3dDevice->BeginScene())) { g_pd3dDevice->SetStreamSource(0, g_pVB, 0, sizeof(CUSTOMVERTEX)); g_pd3dDevice->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE); g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); if(SUCCEEDED(g_pSprite->Begin()))//D3DXSPRITE_ALPHABLEND { g_pSprite->Draw(g_pTexture, &rct, NULL, NULL, NULL, NULL, RGB(0,0,0)); g_pSprite->End(); } g_pd3dDevice->EndScene(); } g_pd3dDevice->Present(NULL, NULL, NULL, NULL); } void Cleanup() { /*if(g_lpDI != NULL) { if(g_lpMouse != NULL) { g_lpMouse->Unacquire(); g_lpMouse->Release(); g_lpMouse = NULL; } g_lpDI->Release(); g_lpDI = NULL; }*/ if(g_pVB != NULL) { g_pVB->Release(); g_pVB = NULL; } if(g_pTexture != NULL) { g_pTexture->Release(); g_pTexture = NULL; } if(g_pSprite != NULL) { g_pSprite->Release(); g_pSprite = NULL; } if(g_pd3dDevice != NULL) { g_pd3dDevice->Release(); g_pd3dDevice = NULL; } if(g_pD3D !=NULL) { g_pD3D->Release(); g_pD3D = NULL; } } 随便问2个问题, 1、vertices[]干什么的? 2、斑竹能讲讲matrix
 楼主| 发表于 2006-3-26 23:59:59 | 显示全部楼层

先顶

发表于 2006-3-27 01:53:33 | 显示全部楼层

你的DIX肯定是低于9.0b的版本。

首先不知道你的SetRect(&rct, 400, 400, 500, 500);这里设置的范围为什么是这样的,你调进来的图片尺寸有多大啊?(400,400)~(500,500)这个范围可能已经超出了你的图片尺寸了,选SetRect(&rct, 0, 0, 500, 500);也许就出来了!

黑的原因有两个,一个是Reader()里刷新屏幕是黑的,另外你的Sprite->draw()颜色也是黑的。RGB(0,0,0)是黑色。

1、vertices[]干什么的?--------------顶点信息,Sprite绘制2D里面可以不用。
2、斑竹能讲讲matrix--------矩阵很麻烦!一时半会说不清楚。

 楼主| 发表于 2006-3-27 10:08:57 | 显示全部楼层

谢谢鼹鼠

我知道rct用来设定一个范围来显示图片,我是随便设定了一个范围。

sprite->Draw()里面的RGB颜色该设一个什么颜色,才能完好的显示我的图片呢?

希望鼹鼠给点意见

发表于 2006-3-27 13:42:29 | 显示全部楼层

rct这个范围是指你图片资源中要显示的区域。

sprite->Draw()中最后一个参数最好不要写成RGB()的,直接写成0xffffffff 这里后面6个FF代表颜色,全是f表示白色,和你的图片色叠加显示正常图片色。如果是黑色(我没用过),也会显示黑色,而且0xff这两个ff表示的是透明度,ff表示不透明,如果你采用都是0的话表示全透明(RGB(0,0,0)默认指定可能是全0),那也是显示背景色,就是你指定的黑色。

 楼主| 发表于 2006-3-27 15:20:10 | 显示全部楼层

thx,鼹鼠,我的图形出来了.

发表于 2006-3-27 15:29:53 | 显示全部楼层

呵呵,出来了就好

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-6-22 22:49

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表