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

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

新規登録して質問してみよう
ただいま回答率
85.50%
DirectX

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

Q&A

解決済

1回答

1421閲覧

DirectX四角形描画

MZK_0104

総合スコア23

DirectX

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

0グッド

0クリップ

投稿2020/05/08 00:48

編集2020/05/09 04:47

四角形の描画までコードを書き進めました。
そのコードは以下の通りです。

DirectX9

1#include<windows.h> 2#include<d3d9.h> 3#include<d3dx9.h> 4#pragma comment( lib, "d3d9.lib" ) 5#pragma comment( lib, "d3dx9d.lib" ) 6#pragma comment( lib, "d3dx9.lib" ) 7#pragma comment( lib, "dxerr.lib" ) 8#define MY_VERTEX_FVF (D3DFVF_XYZ | D3DFVF_DIFFUSE) 9 10LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) { 11 switch (msg) { 12 case WM_DESTROY: 13 PostQuitMessage(0); 14 return 0; 15 } 16 return DefWindowProc(hwnd, msg, wp, lp); 17} 18 19struct MY_VERTEX { 20 D3DXVECTOR3 p; 21 DWORD color; 22}; 23 24int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 25 PSTR lpCmdLine, int nCmdShow) { 26 HWND hwnd; 27 MSG msg; 28 WNDCLASS winc; 29 LPDIRECT3D9 m_pD3D = NULL; 30 D3DPRESENT_PARAMETERS m_D3DPP; 31 D3DDISPLAYMODE d3ddm; 32 LPDIRECT3DDEVICE9 m_pD3DDevice = NULL; 33 LPDIRECT3DVERTEXBUFFER9 m_pMyVB; 34 35 d3ddm.Width = 1280; 36 d3ddm.Height = 720; 37 d3ddm.Format = D3DFMT_A8R8G8B8; 38 d3ddm.RefreshRate = 60; 39 winc.style = CS_HREDRAW | CS_VREDRAW; 40 winc.lpfnWndProc = WndProc; 41 winc.cbClsExtra = winc.cbWndExtra = 0; 42 winc.hInstance = hInstance; 43 winc.hIcon = LoadIcon(NULL, IDI_APPLICATION); 44 winc.hCursor = LoadCursor(NULL, IDC_ARROW); 45 winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 46 winc.lpszMenuName = NULL; 47 winc.lpszClassName = TEXT("WCN"); 48 49 if (!RegisterClass(&winc)) return 0; 50 51 hwnd = CreateWindow( 52 TEXT("WCN"), TEXT("TEST"), 53 WS_OVERLAPPED | WS_VISIBLE | WS_SYSMENU, 54 175, 50, 1920, 1080, NULL, NULL, 55 hInstance, NULL 56 ); 57 58 if (hwnd == NULL) return 0; 59 RECT rw, rc; 60 GetWindowRect(hwnd, &rw); // ウィンドウ全体のサイズ 61 GetClientRect(hwnd, &rc); // クライアント領域のサイズ 62 int new_width = (rw.right - rw.left) - (rc.right - rc.left) + 1280; 63 int new_height = (rw.bottom - rw.top) - (rc.bottom - rc.top) + 720; 64 SetWindowPos(hwnd, NULL, 0, 0, new_width, new_height, SWP_NOMOVE | SWP_NOZORDER); 65 66 BOOL isFullScreen = FALSE; 67 for (int i = 0; i < __argc; i++) { 68 if (_stricmp(__argv[i], "/f") == 0) { 69 isFullScreen = TRUE; 70 break; 71 } 72 } 73 74 75 if ((m_pD3D = ::Direct3DCreate9(D3D_SDK_VERSION)) == 0) { 76 return E_FAIL; 77 } 78 79 ZeroMemory(&m_D3DPP, sizeof(D3DPRESENT_PARAMETERS)); 80 81 m_D3DPP.BackBufferCount = 1; 82 if (isFullScreen) { 83 m_D3DPP.Windowed = FALSE; 84 m_D3DPP.BackBufferWidth = 1280; 85 m_D3DPP.BackBufferHeight = 720; 86 } 87 else { 88 m_D3DPP.Windowed = TRUE; 89 } 90 m_D3DPP.BackBufferFormat = d3ddm.Format; 91 m_D3DPP.SwapEffect = D3DSWAPEFFECT_DISCARD; 92 m_D3DPP.EnableAutoDepthStencil = TRUE; 93 m_D3DPP.AutoDepthStencilFormat = D3DFMT_D16; 94 95 if (FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, 96 D3DDEVTYPE_HAL, 97 hwnd, 98 D3DCREATE_HARDWARE_VERTEXPROCESSING, 99 &m_D3DPP, &m_pD3DDevice))) { 100 if (FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, 101 D3DDEVTYPE_HAL, 102 hwnd, 103 D3DCREATE_SOFTWARE_VERTEXPROCESSING, 104 &m_D3DPP, &m_pD3DDevice))) { 105 if (FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, 106 D3DDEVTYPE_REF, 107 hwnd, 108 D3DCREATE_SOFTWARE_VERTEXPROCESSING, 109 &m_D3DPP, &m_pD3DDevice))) { 110 return E_FAIL; 111 } 112 } 113 } 114 115` if (FAILED(m_pD3DDevice->CreateVertexBuffer( 116 4*sizeof(MY_VERTEX), 117 D3DUSAGE_WRITEONLY, 118 MY_VERTEX_FVF, 119 D3DPOOL_MANAGED, 120 &m_pMyVB, 121 NULL))) { 122 return E_FAIL; 123 } 124 125 MY_VERTEX* v; 126 m_pMyVB->Lock(0, 0, (void**)&v, 0); 127 128 v[0].p = D3DXVECTOR3(-1.5f, 1.5f, 0.0f); //頂点1 129 v[0].p = D3DXVECTOR3(1.5f, 1.5f, 0.0f); //頂点2 130 v[0].p = D3DXVECTOR3(-1.5f, -1.5f, 0.0f); //頂点3 131 v[0].p = D3DXVECTOR3(1.5f, -1.5f, 0.0f); //頂点4 132 133 //頂点データ:頂点の基本的な色の設定(すべて白色) 134 v[0].color = v[1].color = v[2].color = v[3].color 135 = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f); 136 137 m_pMyVB->Unlock(); 138 139 if (FAILED(m_pD3DDevice->BeginScene())) { 140 141 m_pD3DDevice->SetStreamSource(0, m_pMyVB, 0, sizeof(MY_VERTEX)); 142 143 m_pD3DDevice->SetFVF(MY_VERTEX_FVF); 144 m_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); 145 } 146 147 return 0; 148 } 149 150 if (FAILED(m_pD3DDevice->Clear(0, NULL, 151 D3DCLEAR_TARGET | 152 D3DCLEAR_ZBUFFER, 153 D3DCOLOR_XRGB(0, 0, 0), 154 1.0f, 155 0))) { 156 return 0; 157 } 158 159 m_pD3DDevice->EndScene(); 160 161 if (FAILED(m_pD3DDevice->Present(0, 0, 0, 0))) { 162 m_pD3DDevice->Reset(&m_D3DPP); 163 } 164 while (GetMessage(&msg, NULL, 0, 0)) DispatchMessage(&msg); 165 return msg.wParam; 166}
上のコードの一番下のif文while分あたりにエラーが出て、 エラー内容は 1>c:\users\mzk0104\source\repos\project4\project4\source.cpp(28): warning C4101: 'msg': ローカル変数は 1 度も使われていません。 1>c:\users\mzk0104\source\repos\project4\project4\source.cpp(151): error C2059: 構文エラー: 'if' 1>c:\users\mzk0104\source\repos\project4\project4\source.cpp(156): error C2143: 構文エラー: ';' が '{' の前にありません。 1>c:\users\mzk0104\source\repos\project4\project4\source.cpp(156): error C2447: '{': 対応する関数ヘッダーがありません (旧形式の仮引数リスト?) 1>c:\users\mzk0104\source\repos\project4\project4\source.cpp(160): error C3927: '->': 後続の戻り値の型は、関数以外の宣言の後に許可されていません 1>c:\users\mzk0104\source\repos\project4\project4\source.cpp(160): error C3613: '->' の後に戻り型が指定されていません ('int' と見なされます) 1>c:\users\mzk0104\source\repos\project4\project4\source.cpp(160): error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 1>c:\users\mzk0104\source\repos\project4\project4\source.cpp(160): error C2146: 構文エラー: ';' が、識別子 'EndScene' の前に必要です。 1>c:\users\mzk0104\source\repos\project4\project4\source.cpp(162): error C2059: 構文エラー: 'if' 1>c:\users\mzk0104\source\repos\project4\project4\source.cpp(162): error C2143: 構文エラー: ';' が '{' の前にありません。 1>c:\users\mzk0104\source\repos\project4\project4\source.cpp(162): error C2447: '{': 対応する関数ヘッダーがありません (旧形式の仮引数リスト?) 1>c:\users\mzk0104\source\repos\project4\project4\source.cpp(165): error C2059: 構文エラー: 'while' 1>c:\users\mzk0104\source\repos\project4\project4\source.cpp(166): error C2059: 構文エラー: 'return' 1>c:\users\mzk0104\source\repos\project4\project4\source.cpp(167): error C2059: 構文エラー: '}' 1>c:\users\mzk0104\source\repos\project4\project4\source.cpp(167): error C2143: 構文エラー: ';' が '}' の前にありません。

だそうです。
中心当たりの

if (FAILED(m_pD3DDevice->CreateVertexBuffer( 4*sizeof(MY_VERTEX), D3DUSAGE_WRITEONLY, MY_VERTEX_FVF, D3DPOOL_MANAGED, &m_pMyVB, NULL))) { return E_FAIL; }

のreturn E_FAILを消すと、動作はしますが
四角形が描画されません...

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

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

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

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

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

SHOMI

2020/05/08 08:31

ソースコードが```からはみ出て崩れてしまっているので貼りなおしてもらえますか。
MZK_0104

2020/05/09 03:08

すみません...
SHOMI

2020/05/09 04:42 編集

>return E_FAILを消すと、動作はしますが 貼られているコードでは if (FAILED(m_pD3DDevice->Clear(0, NULL, の前の{でWinMainが終わっていてビルドが通りませんが… 1>c:\users\mzk0104\source\repos\project4\project4\source.cpp(151): error C2059: 構文エラー: 'if' 1>c:\users\mzk0104\source\repos\project4\project4\source.cpp(156): error C2143: 構文エラー: ';' が '{' の前にありません。 の原因でもありますが…
MZK_0104

2020/05/09 04:46

それは、エラーコードです それも囲ったほうがいいですかね?
SHOMI

2020/05/09 05:31 編集

エラーコードであることは認識しています。 エラーが見づらいので囲ったほうがよいですが、 return E_FAILをを消しただけではまだ{}の対応がとれておらずビルドが通るはずがないという意味で書きました
guest

回答1

0

ベストアンサー

  • 頂点指定

インデックスがすべて0になっています。

diff

1- v[0].p = D3DXVECTOR3(1.5f, 1.5f, 0.0f); //頂点2 2+ v[1].p = D3DXVECTOR3(1.5f, 1.5f, 0.0f); //頂点2 3- v[0].p = D3DXVECTOR3(-1.5f, -1.5f, 0.0f); //頂点3 4+ v[2].p = D3DXVECTOR3(-1.5f, -1.5f, 0.0f); //頂点3 5- v[0].p = D3DXVECTOR3(1.5f, -1.5f, 0.0f); //頂点4 6+ v[3].p = D3DXVECTOR3(1.5f, -1.5f, 0.0f); //頂点4
  • {,}の対応がとれていない。

C++

1 if (FAILED(m_pD3DDevice->BeginScene())) { 2 3 m_pD3DDevice->SetStreamSource(0, m_pMyVB, 0, sizeof(MY_VERTEX)); 4 5 m_pD3DDevice->SetFVF(MY_VERTEX_FVF); 6 m_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); 7 } 8 9 return 0; 10 }

}が余分に入っておりWinMainのブロックがここで終わっているため大量のエラーの原因となっています。
また、BeginScene()失敗時に描画を行うコードになっています。

C++

1 if (FAILED(m_pD3DDevice->BeginScene())) { 2 return 0; 3 } 4 m_pD3DDevice->SetStreamSource(0, m_pMyVB, 0, sizeof(MY_VERTEX)); 5 m_pD3DDevice->SetFVF(MY_VERTEX_FVF); 6 m_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);

では?

  • 描画結果をクリアしている。

Clear()DrawPrimitive()より前へ移動してください。

  • 光源計算をOFFにする

黒く描画されています。
以下をDrawPrimitive()より前に入れて光源計算をOFFにすれば描画結果を確認できます。

C++

1m_pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);

投稿2020/05/09 07:29

SHOMI

総合スコア4079

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

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

MZK_0104

2020/05/10 02:07

現在、以下のコードで同じような結果です。 #include<windows.h> #include<d3d9.h> #include<d3dx9.h> #pragma comment( lib, "d3d9.lib" ) #pragma comment( lib, "d3dx9d.lib" ) #pragma comment( lib, "d3dx9.lib" ) #pragma comment( lib, "dxerr.lib" ) #define MY_VERTEX_FVF (D3DFVF_XYZ | D3DFVF_DIFFUSE) LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, msg, wp, lp); } struct MY_VERTEX { D3DXVECTOR3 p; DWORD color; }; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow) { HWND hwnd; MSG msg; WNDCLASS winc; LPDIRECT3D9 m_pD3D = NULL; D3DPRESENT_PARAMETERS m_D3DPP; D3DDISPLAYMODE d3ddm; LPDIRECT3DDEVICE9 m_pD3DDevice = NULL; LPDIRECT3DVERTEXBUFFER9 m_pMyVB; d3ddm.Width = 1280; d3ddm.Height = 720; d3ddm.Format = D3DFMT_A8R8G8B8; d3ddm.RefreshRate = 60; winc.style = CS_HREDRAW | CS_VREDRAW; winc.lpfnWndProc = WndProc; winc.cbClsExtra = winc.cbWndExtra = 0; winc.hInstance = hInstance; winc.hIcon = LoadIcon(NULL, IDI_APPLICATION); winc.hCursor = LoadCursor(NULL, IDC_ARROW); winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); winc.lpszMenuName = NULL; winc.lpszClassName = TEXT("WCN"); if (!RegisterClass(&winc)) return 0; hwnd = CreateWindow( TEXT("WCN"), TEXT("TEST"), WS_OVERLAPPED | WS_VISIBLE | WS_SYSMENU, 175, 50, 1920, 1080, NULL, NULL, hInstance, NULL ); if (hwnd == NULL) return 0; RECT rw, rc; GetWindowRect(hwnd, &rw); // ウィンドウ全体のサイズ GetClientRect(hwnd, &rc); // クライアント領域のサイズ int new_width = (rw.right - rw.left) - (rc.right - rc.left) + 1280; int new_height = (rw.bottom - rw.top) - (rc.bottom - rc.top) + 720; SetWindowPos(hwnd, NULL, 0, 0, new_width, new_height, SWP_NOMOVE | SWP_NOZORDER); BOOL isFullScreen = FALSE; for (int i = 0; i < __argc; i++) { if (_stricmp(__argv[i], "/f") == 0) { isFullScreen = TRUE; break; } } if ((m_pD3D = ::Direct3DCreate9(D3D_SDK_VERSION)) == 0) { return E_FAIL; } ZeroMemory(&m_D3DPP, sizeof(D3DPRESENT_PARAMETERS)); m_D3DPP.BackBufferCount = 1; if (isFullScreen) { m_D3DPP.Windowed = FALSE; m_D3DPP.BackBufferWidth = 1280; m_D3DPP.BackBufferHeight = 720; } else { m_D3DPP.Windowed = TRUE; } m_D3DPP.BackBufferFormat = d3ddm.Format; m_D3DPP.SwapEffect = D3DSWAPEFFECT_DISCARD; m_D3DPP.EnableAutoDepthStencil = TRUE; m_D3DPP.AutoDepthStencilFormat = D3DFMT_D16; if (FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &m_D3DPP, &m_pD3DDevice))) { if (FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &m_D3DPP, &m_pD3DDevice))) { if (FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &m_D3DPP, &m_pD3DDevice))) { return E_FAIL; } } } if (FAILED(m_pD3DDevice->CreateVertexBuffer( 4 * sizeof(MY_VERTEX), D3DUSAGE_WRITEONLY, MY_VERTEX_FVF, D3DPOOL_MANAGED, &m_pMyVB, NULL))) { return E_FAIL; } MY_VERTEX* v; m_pMyVB->Lock(0, 0, (void**)&v, 0); v[0].p = D3DXVECTOR3(-1.5f, 1.5f, 0.0f); //頂点1 v[1].p = D3DXVECTOR3(1.5f, 1.5f, 0.0f); //頂点2 v[2].p = D3DXVECTOR3(-1.5f, -1.5f, 0.0f); //頂点3 v[3].p = D3DXVECTOR3(1.5f, -1.5f, 0.0f); //頂点4 //頂点データ:頂点の基本的な色の設定(すべて白色) v[0].color = v[1].color = v[2].color = v[3].color = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f); m_pMyVB->Unlock(); if (FAILED(m_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0))) { return 0; } if (FAILED(m_pD3DDevice->BeginScene())) { return 0; } m_pD3DDevice->SetStreamSource(0, m_pMyVB, 0, sizeof(MY_VERTEX)); m_pD3DDevice->SetFVF(MY_VERTEX_FVF); m_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); m_pD3DDevice->EndScene(); if (FAILED(m_pD3DDevice->Present(0, 0, 0, 0))) { m_pD3DDevice->Reset(&m_D3DPP); } while (GetMessage(&msg, NULL, 0, 0)) DispatchMessage(&msg); return msg.wParam; }
SHOMI

2020/05/10 03:28

SetRenderStateが入っていません
MZK_0104

2020/05/10 09:00

公言結果をオフにしても、 ウィンドウが白くなるだけでした...
MZK_0104

2020/05/10 09:01

すみません訂正です、 公言結果x 光源結果○
SHOMI

2020/05/10 11:15 編集

(-1.5,-1.5)-(1.5,1.5)でウインドウの外まで白い四角を書いているのだから当然の結果です。試しに(-0.5,-0.5)-(0.5,0.5)にしてみては?
SHOMI

2020/05/10 18:13 編集

クリア時の色を黒以外にし、四角形の色を白以外にしていればすぐに気付いたとは思いますが…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問