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

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

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

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

Q&A

受付中

IDXGIFactory6の定義が見つからない

midorigame
midorigame

総合スコア0

DirectX

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

0回答

0グッド

0クリップ

165閲覧

投稿2022/11/29 06:40

編集2022/11/29 06:44

前提

ここに質問の内容を詳しく書いてください。
(例)
DirectXの魔導書に従いDirectxの学習をしています。
自身のリポジトリ(https://github.com/midorigame737/DirectX
)を外出用のノートPCに持ってきて、プロジェクトを実行しようとした際にIDXGIFactory6が定義されていない旨のエラーが発生しました。普段使用のPCでは発生せず。

実現したいこと

ノートPCでコンパイルが通るようにする

発生している問題・エラーメッセージ

重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 エラー (アクティブ) E0020 識別子 "IDXGIFactory6" が定義されていません Project7 46 重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 エラー (アクティブ) E0020 識別子 "_dxgiFactory" が定義されていません Project7 46 エラー (アクティブ) E0304 関数テンプレート "IID_PPV_ARGS_Helper" のインスタンスが引数リストと一致しません Project7 65

該当のソースコード

main.cpp

1#include<Windows.h> 2#include<vector> 3#ifdef _DEBUG 4#include<iostream> 5#include <tchar.h> 6#include<d3d12.h> 7#include<dxgi1_6.h> 8#define WINDOW_WIDTH 1280 9#define WINDOW_HEIGHT 720 10#pragma comment(lib,"d3d12.lib") 11#pragma comment(lib,"dxgi.lib") 12#endif 13 14using namespace std; 15//@brief コンソール画面にフォーマット付き文字列を表示 16//@param format(%dとか%fとかの) 17//@param 可変長引数 18//@remarks この関数はデバッグ用 デバッグ時にしか動かない 19void DebugOutputFormatString(const char* format, ...) 20{ 21 #ifdef _DEBUG 22 va_list valist;//可変長引数格納するところ 23 va_start(valist, format);//可変長引数リストへのアクセス,va_startの第二引数は最後の固定引数 24 printf(format, valist); 25 va_end(valist); 26 #endif 27} 28 29LRESULT WindowProcedure(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { 30 //ウィンドウが破棄されたら呼ばれる 31 if (msg == WM_DESTROY) { 32 PostQuitMessage(0);//OSに対してアプリの終了を知らせる 33 return 0; 34 } 35 return DefWindowProc(hwnd, msg, wparam, lparam);//基底の処理 36} 37#ifdef _DEBUG 38int main() { 39#else 40#include<Windows.h> 41int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) 42{ 43#endif 44 //Direct3D基本オブジェクト生成 45 ID3D12Device* _dev = nullptr;//コマンドキューとかコマンドリストとか色々作成するためのもの 46 IDXGIFactory6* _dxgiFactory = nullptr;//GPU設定に基づいたグラフィックスアダプタを選択する 47 IDXGISwapChain4* _swapchain = nullptr;// 48 ID3D12CommandAllocator* _cmdAllocator = nullptr;//GPUコマンド用のストレージ割り当てとかそこへのインターフェース 49 ID3D12GraphicsCommandList* _cmdList = nullptr;//レンダリング用のグラフィックスコマンドの命令オブジェクト 50 ID3D12CommandQueue* cmdQueue = nullptr;//コマンドリストでためた命令セットを実行していくためのキュー 51 WNDCLASSEX w = {}; 52 D3D_FEATURE_LEVEL levels[] = { 53 D3D_FEATURE_LEVEL_12_1, 54 D3D_FEATURE_LEVEL_12_0, 55 D3D_FEATURE_LEVEL_11_1, 56 D3D_FEATURE_LEVEL_11_0, 57 }; 58 D3D_FEATURE_LEVEL feature_level; 59 for (auto lv : levels) { 60 if (D3D12CreateDevice(nullptr, lv, IID_PPV_ARGS(&_dev)) == S_OK) { 61 feature_level = lv; 62 break; 63 } 64 } 65 auto result = CreateDXGIFactory1(IID_PPV_ARGS(&_dxgiFactory)); 66 67 //アダプタの列挙型 68 std::vector<IDXGIAdapter*>adapters; 69 //ここに特定の名前を持つアダプターオブジェクトが入る 70 IDXGIAdapter* tmpAdapter = nullptr; 71 //利用可能なアダプターを列挙し、列挙されたアダプターをstd::vectorに格納 72 for (int i = 0; _dxgiFactory->EnumAdapters(i, &tmpAdapter) != DXGI_ERROR_NOT_FOUND; ++i) { 73 adapters.push_back(tmpAdapter); 74 } 75 for (auto adpt : adapters) { 76 DXGI_ADAPTER_DESC adesc = {}; 77 adpt->GetDesc(&adesc);//アダプターの説明オブジェクト取得 78 std::wstring strDesc = adesc.Description; 79 //探したいアダプターの名前を確認 80 //NVIDIAが含まれているアダプターオブジェクトを見つけてtmpAdapterに格納 81 if (strDesc.find(L"NVIDIA") != std::string::npos) { 82 tmpAdapter = adpt; 83 break; 84 } 85 } 86 //コマンドアロケーター(ID3D12CommandAllocator)の生成 87 result = _dev->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, 88 IID_PPV_ARGS(&_cmdAllocator)); 89 result = _dev->CreateCommandList(0, 90 D3D12_COMMAND_LIST_TYPE_DIRECT, 91 _cmdAllocator, nullptr, 92 IID_PPV_ARGS(&_cmdList)); 93 94 //コマンドキューの設定 95 D3D12_COMMAND_QUEUE_DESC cmdQueueDesc = {}; 96 cmdQueueDesc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE;//タイムアウトなし 97 cmdQueueDesc.NodeMask = 0; 98 cmdQueueDesc.Priority = D3D12_COMMAND_QUEUE_PRIORITY_NORMAL;//プライオリティ特になし 99 cmdQueueDesc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT;//コマンドリストと合わせる 100 result = _dev->CreateCommandQueue(&cmdQueueDesc, 101 IID_PPV_ARGS(&cmdQueue));//コマンドキュー生成 102 103 w.cbSize = sizeof(WNDCLASSEX); 104 w.lpfnWndProc = (WNDPROC)WindowProcedure;//コールバック関数の指定 105 w.lpszClassName = _T("DX12sample");//アプリケーション名てきとうでいい 106 w.hInstance = GetModuleHandle(nullptr);//ハンドルの取得 107 RegisterClassEx(&w);//アプリケーションクラス(ウィンドウの指定をOSに伝える) 108 RECT wrc = { 0,0,WINDOW_WIDTH,WINDOW_HEIGHT };//ウィンドウサイズ決定 109 //関数でウィンドウサイズを補正する 110 AdjustWindowRect(&wrc, WS_OVERLAPPEDWINDOW, false); 111 //ウィンドウの生成 112 HWND hwnd = CreateWindow(w.lpszClassName,//クラス名指定 113 _T("DX12テスト"),//タイトルバーの文字 114 WS_OVERLAPPEDWINDOW,//タイトルバーと境界線があるウィンドウ 115 CW_USEDEFAULT,//X座標はOSに任せる 116 CW_USEDEFAULT,//Y座標はOSに任せる 117 wrc.right - wrc.left,//ウィンドウ幅 118 wrc.bottom - wrc.top,//ウィンドウ高 119 nullptr,//親ウィンドウタイトル 120 nullptr, 121 w.hInstance,//呼び出しアプリケーションハンドル 122 nullptr); 123 124 DXGI_SWAP_CHAIN_DESC1 swapchainDesc = {};//レンダリングされたデータを出力する前に格納するためのオブジェクト 125 swapchainDesc.Width = WINDOW_WIDTH; 126 swapchainDesc.Height = WINDOW_HEIGHT; 127 swapchainDesc.Format =DXGI_FORMAT_R8G8B8A8_UNORM; 128 swapchainDesc.Stereo = false; 129 swapchainDesc.SampleDesc.Count = 1; 130 swapchainDesc.SampleDesc.Quality = 0; 131 swapchainDesc.BufferUsage = DXGI_USAGE_BACK_BUFFER; 132 swapchainDesc.BufferCount = 2;//バックバッファは伸び縮み可能 133 swapchainDesc.Scaling = DXGI_SCALING_STRETCH;//フリップ後は速やかに破棄 134 swapchainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; 135 //特に指定なし 136 swapchainDesc.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED;//ウィンドウフルスクリーン切り替え可能 137 swapchainDesc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; 138 result = _dxgiFactory->CreateSwapChainForHwnd( 139 //swapchainの出力ウィンドウのハンドルに関連付けられているswapchain作成 140 cmdQueue, 141 hwnd, 142 &swapchainDesc, 143 nullptr, 144 nullptr, 145 (IDXGISwapChain1**)&_swapchain); 146 D3D12_DESCRIPTOR_HEAP_DESC heapDesc = {};//ディスクリプタヒープ(ディスクリプタの内容を格納しておくところ)を作るための設定を書くためのオブジェクト 147 heapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV;//バッファの用途を教えてあげるところ、レンダターゲットだからRTV 148 heapDesc.NodeMask = 0;//本来GPuが複数あるときのためのものなので0 149 heapDesc.NumDescriptors = 2;//表と裏だから2つ 150 heapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;//ビュー情報にあたつ情報をシェーダ側から参照する必要性があるかどうか、今回は特に指定なし 151 ID3D12DescriptorHeap* rtvHeaps = nullptr; 152 result = _dev->CreateDescriptorHeap(&heapDesc, IID_PPV_ARGS(&rtvHeaps)); 153 DXGI_SWAP_CHAIN_DESC swcDesc = {};// 154 result = _swapchain->GetDesc(&swcDesc);//[investigate] 155 std::vector<ID3D12Resource*>_backBuffers(swcDesc.BufferCount); 156 for (int idx = 0; idx < swcDesc.BufferCount; ++idx) {//バックバッファの数だけ設定が必要なのでループ 157 result = _swapchain->GetBuffer(idx, IID_PPV_ARGS(&_backBuffers[idx]));//スワップチェーン上のバックバッファ取得 158 D3D12_CPU_DESCRIPTOR_HANDLE handle = rtvHeaps->GetCPUDescriptorHandleForHeapStart();//[invistigate] 159 handle.ptr += idx * _dev->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV); 160 _dev->CreateRenderTargetView(_backBuffers[idx], nullptr, handle); 161 } 162 163 ShowWindow(hwnd, SW_SHOW); 164 MSG msg = {}; 165 while (true) { 166 if (PeekMessageW(&msg, nullptr, 0, 0, PM_REMOVE)) { 167 TranslateMessage(&msg); 168 DispatchMessageW(&msg); 169 } 170 //アプリケーションが終わるときにmessageがWM_QUITになる 171 if (msg.message == WM_QUIT) { 172 break; 173 } 174 } 175 auto bbIdx = _swapchain->GetCurrentBackBufferIndex();//[invistigate] 176 result = _cmdAllocator->Reset();//[invistigate] 177 178 auto rtvH = rtvHeaps->GetCPUDescriptorHandleForHeapStart(); 179 rtvH.ptr += bbIdx * _dev->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV); 180 _cmdList->OMSetRenderTargets(1, &rtvH, true, nullptr); 181 UnregisterClass(w.lpszClassName, w.hInstance);//もうクラスを使わないので登録解除 182 float clearColor[] = { 1.0f,1.0f,0.0f,1.0f };//黄色で画面クリア 183 _cmdList->ClearRenderTargetView(rtvH, clearColor, 0, nullptr); 184 //命令のクローズ 185 _cmdList->Close(); 186 ID3D12CommandList* cmdlists[] = { _cmdList }; 187 cmdQueue->ExecuteCommandLists(1, cmdlists); 188 _cmdAllocator->Reset(); 189 _cmdList->Reset(_cmdAllocator,nullptr );//再びコマンドリストをためる準備 190 //フリップ 191 _swapchain->Present(1, 0); 192 DebugOutputFormatString("Show window test."); 193 getchar(); 194 return 0; 195}

試したこと

includeするヘッダファイルの追加

補足情報

  • 開発環境:VisualStudio2019

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

DirectX

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