【问题标题】:How to switch between background colors in DirectX如何在 DirectX 中的背景颜色之间切换
【发布时间】:2017-09-22 14:23:08
【问题描述】:


我想要什么?
为了尽可能快地在 2 种背景颜色(比如说白色和红色)之间切换,更具体地说,我希望屏幕始终是白色的,并且对于 1 帧(这很短)每次都是红色的说 500 毫秒
我知道什么?
好吧,我整天都在寻找如此简单的示例,但与我想要的相比,我所能找到的一切都如此复杂,所以任何 simple 教程都笑着接受 :)
为什么我使用 DirectX?
我试图在 OpenGL 上做但没有成功,here 有人告诉我应该使用this,但我不知道如何也找不到学习的地方...... DX 的版本并不重要对我来说,我只需要它尽可能快..
所以,我希望你能帮助我,无论如何谢谢:)

更新:仍然没有答案

【问题讨论】:

    标签: c++ directx directx-11 directx-12


    【解决方案1】:

    我提出一个建议,希望对您有所帮助。请尝试以下步骤:

    包括基本的windows头文件和Direct3D头文件:

    #include <windows.h>
    #include <windowsx.h>
    #include <d3d9.h>
    

    包含 Direct3D 库文件:

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

    然后添加以下代码:

    // global declarations
    LPDIRECT3D9 d3d;    // the pointer to our Direct3D interface
    LPDIRECT3DDEVICE9 d3ddev;    // the pointer to the device class
    
    // function prototypes
    void initD3D(HWND hWnd);    // sets up and initializes Direct3D
    void render_frame(void);    // renders a single frame
    void cleanD3D(void);    // closes Direct3D and releases memory
    
    // the WindowProc function prototype
    LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
    
    
    // the entry point for any Windows program
    int WINAPI WinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPSTR lpCmdLine,
                       int nCmdShow)
    {
        HWND hWnd;
        WNDCLASSEX wc;
    
        ZeroMemory(&wc, sizeof(WNDCLASSEX));
    
        wc.cbSize = sizeof(WNDCLASSEX);
        wc.style = CS_HREDRAW | CS_VREDRAW;
        wc.lpfnWndProc = (WNDPROC)WindowProc;
        wc.hInstance = hInstance;
        wc.hCursor = LoadCursor(NULL, IDC_ARROW);
        wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
        wc.lpszClassName = L"WindowClass";
    
        RegisterClassEx(&wc);
    
        hWnd = CreateWindowEx(NULL,
                              L"WindowClass",
                              L"Our First Direct3D Program",
                              WS_OVERLAPPEDWINDOW,
                              300, 300,
                              640, 480,
                              NULL,
                              NULL,
                              hInstance,
                              NULL);
    
        ShowWindow(hWnd, nCmdShow);
    
        // set up and initialize Direct3D
        initD3D(hWnd);
    
        // enter the main loop:
    
        MSG msg;
    
        while(TRUE)
        {
            DWORD starting_point = GetTickCount();
    
            if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
            {
                if (msg.message == WM_QUIT)
                    break;
    
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
    
            render_frame();
    
            while ((GetTickCount() - starting_point) < 25);
        }
    
        // clean up DirectX and COM
        cleanD3D();
    
        return msg.wParam;
    }
    
    // this is the main message handler for the program
    LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch(message)
        {
            case WM_DESTROY:
                {
                    PostQuitMessage(0);
                    return 0;
                } break;
        }
    
        return DefWindowProc (hWnd, message, wParam, lParam);
    }
    
    // this function initializes and prepares Direct3D for use
    void initD3D(HWND hWnd)
    {
        d3d = Direct3DCreate9(D3D_SDK_VERSION);    // create the Direct3D interface
    
        D3DPRESENT_PARAMETERS d3dpp;    // create a struct to hold various device information
    
        ZeroMemory(&d3dpp, sizeof(d3dpp));    // clear out the struct for use
        d3dpp.Windowed = TRUE;    // program windowed, not fullscreen
        d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;    // discard old frames
        d3dpp.hDeviceWindow = hWnd;    // set the window to be used by Direct3D
    
    
        // create a device class using this information and the info from the d3dpp stuct
        d3d->CreateDevice(D3DADAPTER_DEFAULT,
                          D3DDEVTYPE_HAL,
                          hWnd,
                          D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                          &d3dpp,
                          &d3ddev);
    
        return;
    }
    
    // this is the function used to render a single frame
    void render_frame(void)
    {
        d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0);
    
        d3ddev->BeginScene();    // begins the 3D scene
    
        // do 3D rendering here
    
        d3ddev->EndScene();    // ends the 3D scene
    
        d3ddev->Present(NULL, NULL, NULL, NULL);   // displays the created frame on the screen
    
        return;
    }
    
    // this is the function that cleans up Direct3D and COM
    void cleanD3D(void)
    {
        d3ddev->Release();    // close and release the 3D device
        d3d->Release();    // close and release Direct3D
    
        return;
    }
    

    【讨论】:

    • 感谢您的回答!但是,我只看到一个蓝屏,如何验证 1 帧是红色的?通常我所做的是在我回到原来的号码之前使用Sleep(500),但在这里我不明白我需要把它放在哪里。
    • @Peewe 看看这个link
    • 我需要做的就是再次致电render_frame。谢谢!
    • 赞成,但有一个问题,我用 60FPS 记录器捕获了我的屏幕,然后以慢动作播放它,红色屏幕停留了约 120 毫秒,这几乎是 10 帧而不是 1 帧。 ..你有更好的方法吗?在您的程序中,您使用的是双缓冲和垂直同步?
    • @Peewe 我不知道,在这个程序中我使用了this page 来指导你。但我研究了很多关于 Vsync 的页面如下:link1link2link3。抱歉,如果我不能提供更多帮助...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多