尹易鹏 2019-05-21 10:56 采纳率: 0%
浏览 370

Direct3D学习 窗口无显示内容

我是Direct3D的初学者,运行书上的代码时窗口为一片空白,没有显示。校验过几遍代码了,应该没有错,希望有大佬帮忙解答一下
代码如下:
#include
#include
#include
#include
using namespace std;

#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")

//program settings
const string APPTITLE = "Direct3D_Windowed";
const int SCREENW = 1024;
const int SCREENH = 768;

//Direct3D objects
LPDIRECT3D9 d3d = NULL;
LPDIRECT3DDEVICE9 d3ddev = NULL;

bool gameover = false;

//macro to detect key presses
#define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code)&0x8000)?1:0)

/*
Game initialization function
*/
bool Game_Init(HWND window) {
//MessageBox(window, "Game_Init", "BREAKPOINT", 0);

//initialize Direct3D
d3d = Direct3DCreate9(D3D_SDK_VERSION);
if (d3d == NULL) {
    MessageBox(window, "Error initializing Direct3D", "Error", MB_OK);
    return 0;
}

//set Direct3D presentation parameters
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.BackBufferWidth = SCREENW;
d3dpp.BackBufferHeight = SCREENH;
d3dpp.hDeviceWindow = window;

//create Direct3D device
d3d->CreateDevice(
    D3DADAPTER_DEFAULT,
    D3DDEVTYPE_HAL,
    window,
    D3DCREATE_SOFTWARE_VERTEXPROCESSING,
    &d3dpp,
    &d3ddev
);
if (d3ddev == NULL) {
    MessageBox(window, "Error creating Direct3D device", "Error", MB_OK);
    return 0;
}

return true;

}

/*
Game update function
*/
void Game_Run(HWND hwnd) {
//make sure the Direct3D device is valid
if (!d3ddev) return;

//clear the backbuffer to bright green
d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0);

//start rendering
if (d3ddev->BeginScene()) {
    //do something?

    //stop rendering
    d3ddev->EndScene();

    //copy back buffer on the screen
    d3ddev->Present(NULL, NULL, NULL, NULL);
}

//check for escape key(to exit program)
if (KEY_DOWN(VK_ESCAPE))
    PostMessage(hwnd, WM_DESTROY, 0, 0);

}

/*
Game shutdown function
*/
void Game_End(HWND hwnd) {
//display close message
MessageBox(hwnd, "Program is about to end", "Game_End", MB_OK);

//free memory
if (d3ddev) d3ddev->Release();
if (d3d) d3d->Release();

}

/*
Windows event handing function
*/
LRESULT WINAPI WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch(msg) {
case WM_DESTROY:
gameover = true;
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}

/*
Main Windows entry function
*/
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
//set the new window's properties
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)WinProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = APPTITLE.c_str();
wc.hIconSm = NULL;
RegisterClassEx(&wc);

//create a new window
HWND window = CreateWindow(APPTITLE.c_str(), APPTITLE.c_str(),
    //WS_EX_TOPMOST | WS_VISIBLE | WS_POPUP,
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,CW_USEDEFAULT,
    SCREENW,SCREENH,
    NULL,NULL,hInstance,NULL
    );

//was there an error creating the window?
if (window == 0) return 0;

//display the window
ShowWindow(window, nCmdShow);
UpdateWindow(window);

//initialize the game
if (!Game_Init(window)) return 0;

//main message loop
MSG message;
while (!gameover) {
    if (PeekMessage(&message, NULL, 0, 0, PM_REMOVE)) {
        TranslateMessage(&message);
        DispatchMessage(&message);
    }

    Game_Run(window);
}
Game_End(window);

return message.wParam;

}

这是运行结果:
图片说明

另外还有一个小问题,为什么在改变了其分辨率的值以后程序就不能运行了?分辨率的设置有什么特殊要求吗?谢谢大神

  • 写回答

1条回答 默认 最新

  • CodeKMan 2020-02-16 16:07
    关注

    if (d3ddev->BeginScene()) {
    //do something?
    这里要写显示的代码才有东西显示
    //stop rendering
    d3ddev->EndScene();
    分辨率貌似必须是标准比例的显示尺寸如4:3或16:9的
    我也才自学到这点

    评论

报告相同问题?

悬赏问题

  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛