最近DirectX9をいじり始めた者です。
参考書には、何らかのレンダリングを行うのに、最低限度必要な処理は以下の手順だとありました。
1.ウィンドウを作成する
2.Direct3DオブジェクトとDirect3Dデバイスオブジェクトを作成する
3.画面をクリアしてシーンを開始する
4.画面を更新する
3の画面のクリアについて以下の処理をしないとクリアメソッドは失敗するとありました。
C++
1IDirect3Ddevice9::SetRenderState( D3DRS_ZENABLE, TRUE );
C++
1d3dpp.EnableAutoDepthStencil = TRUE; 2d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
しかし、ソースコード(以下に記述)を確認する限り、SetRenderStateメソッド(Zバッファを使用するためのメソッド?)が使われておりません。しかし、ビルドすると、画面が青一色で塗りつぶされ、クリアメソッドが成功しているように見えます。
なぜSetRenderStateメソッドがないのにクリアメソッドが成功しているのでしょうか?教えてください。
よろしくお願いいたします。
因みに以下を使用しております。
Microsoft DirectX SDK (June 2010)
c++
1#include <windows.h> 2#include <d3dx9.h> 3 4#pragma comment(lib,"d3d9.lib") 5#pragma comment(lib,"d3dx9.lib") 6 7LPDIRECT3D9 pD3d = NULL; 8LPDIRECT3DDEVICE9 pDevice = NULL; 9 10LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 11HRESULT InitD3d(HWND); 12VOID Render(); 13 14 15 16INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR szStr, INT iCmdShow) 17{ 18 HWND hWnd = NULL; 19 MSG msg; 20 21 static char szAppName[] = "Direct3D最小コード "; 22 WNDCLASSEX wndclass; 23 24 wndclass.cbSize = sizeof(wndclass); 25 wndclass.style = CS_HREDRAW | CS_VREDRAW; 26 wndclass.lpfnWndProc = WndProc; 27 wndclass.cbClsExtra = 0; 28 wndclass.cbWndExtra = 0; 29 wndclass.hInstance = hInst; 30 wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); 31 wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); 32 wndclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); 33 wndclass.lpszMenuName = NULL; 34 wndclass.lpszClassName = szAppName; 35 wndclass.hIconSm = LoadIcon(NULL, IDI_ASTERISK); 36 RegisterClassEx(&wndclass); 37 38 hWnd = CreateWindow(szAppName, szAppName, WS_OVERLAPPEDWINDOW, 39 0, 0, 400, 300, NULL, NULL, hInst, NULL); 40 ShowWindow(hWnd, SW_SHOW); 41 UpdateWindow(hWnd); 42 43 if (FAILED(InitD3d(hWnd))) 44 { 45 return 0; 46 } 47 48 ZeroMemory(&msg, sizeof(msg)); 49 while (msg.message != WM_QUIT) 50 { 51 if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) 52 { 53 TranslateMessage(&msg); 54 DispatchMessage(&msg); 55 } 56 else 57 { 58 Render(); 59 } 60 } 61 62 pDevice->Release(); 63 pD3d->Release(); 64 return (INT)msg.wParam; 65} 66 67LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam) 68{ 69 switch (iMsg) 70 { 71 case WM_DESTROY: 72 PostQuitMessage(0); 73 break; 74 } 75 return DefWindowProc(hWnd, iMsg, wParam, lParam); 76} 77// 78//HRESULT InitD3d(HWND hWnd) 79//ダイレクト3Dの初期化 80HRESULT InitD3d(HWND hWnd) 81{ 82 if (NULL == (pD3d = Direct3DCreate9(D3D_SDK_VERSION))) 83 { 84 MessageBox(0, "Direct3Dの作成に失敗しました", "", MB_OK); 85 return E_FAIL; 86 } 87 88 D3DPRESENT_PARAMETERS d3dpp; 89 ZeroMemory(&d3dpp, sizeof(d3dpp)); 90 d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; 91 d3dpp.BackBufferCount = 1; InitD3d; 92 d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; 93 d3dpp.Windowed = TRUE; 94 d3dpp.EnableAutoDepthStencil = TRUE; 95 d3dpp.AutoDepthStencilFormat = D3DFMT_D16; 96 97 if (FAILED(pD3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, 98 D3DCREATE_HARDWARE_VERTEXPROCESSING, 99 &d3dpp, &pDevice))) 100 { 101 if (FAILED(pD3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, 102 D3DCREATE_SOFTWARE_VERTEXPROCESSING, 103 &d3dpp, &pDevice))) 104 { 105 MessageBox(0, "HALモードでDIRECT3Dデバイスを作成できません\nREFモードで再試行します", NULL, MB_OK); 106 if (FAILED(pD3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd, 107 D3DCREATE_HARDWARE_VERTEXPROCESSING, 108 &d3dpp, &pDevice))) 109 { 110 if (FAILED(pD3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd, 111 D3DCREATE_SOFTWARE_VERTEXPROCESSING, 112 &d3dpp, &pDevice))) 113 { 114 MessageBox(0, "DIRECT3Dデバイスの作成に失敗しました", NULL, MB_OK); 115 return E_FAIL; 116 } 117 } 118 } 119 } 120 return S_OK; 121} 122 123VOID Render() 124{ 125 pDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0); 126 if (SUCCEEDED(pDevice->BeginScene())) 127 { 128 129 pDevice->EndScene(); 130 } 131 pDevice->Present(NULL, NULL, NULL, NULL); 132}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/23 02:08