質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

Q&A

解決済

1回答

1171閲覧

DirectX9 画面のクリアについて

pman

総合スコア8

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

1グッド

1クリップ

投稿2018/07/15 02:56

最近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}
Dxcaster👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

結構昔の投稿そうなので、見ていらっしゃるか分からないのですが、回答しときます。

SetRenderStateはその名の通り現在の描画の状態を設定します。
これを設定することにより、アルファブレンドやライティング
などが行なえるようになります。

SetRenderStateのZENABLEをいじったとしても現在の目的に関してはあまり関係ないと思います。自分のプロジェクトでは設定しなくても描画できました。
なので、Clearメソッドが失敗している理由は他にあると思われます。
一つの可能性として、ZENABLEをtrueにしていたのに、CLear関数でD3DCLEAR_ZBUFFERを呼び出していないことなどがあります。

あとそのZENABLEをtrueにしないとクリアメソッドが成功しないと書かれていた所のサイトをできれば教えてほしいです。もしかしたら自分の認識が違うかもしれないので。

Z値というのは描画順番に使う値です。
Z値に関しては長くなるので完結に言うと、描画の前後関係を0.0から1.fまでの数値で表しています。
数値が0.fに近づくほど前に、1.fに近づくほど後ろに描画されます。
3Dに関することなので今は触れる必要はないです。

とりあえずポリゴンを一つ作ってみることがおすすめですよ。
描画できているかどうかはポリゴンが作られているかどうかで判断できるからです。

投稿2020/02/21 12:09

tera_kou

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pman

2020/02/23 02:08

アドバイスありがとうございます。 ずっとこないので、回答はもうこないものだと思ってました。 ぜひ参考にさせていただきます。 因みに私が参考にしたのはサイトではなく、電子書籍になります。 [DirectX9 必携 増補版] になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問