Directx11 SDK июнь (2010) Инициализация на VC++ 2010
Я надеюсь, что выкладываю на правильный форум для этого!
Недавно я начал программировать с помощью Directx 11 июня (2010) SDK для VC++ 2010, на ноутбуке Dell LapTop с графическим процессором NVidia GeForce GT 630M и чипом Intel HD 4000.
Одна из вещей, которую вы делаете, - это попытаться перечислить доступные адаптеры и выходы и так далее. Вот пример:
IDXGIFactory1 *factory;
CreateDXGIFactory1(__uuidof(IDXGIFactory1), (LPVOID *)&factory);
IDXGIAdapter *adapter;
factory->EnumAdapters(0, &adapter);
DXGI_ADAPTER_DESC desc;
adapter->GetDesc(&desc);
Когда я запускаю это, структура desc содержит информацию для моего чипа Intel HD, а НЕ информацию для моего графического процессора!
Теперь, когда я открываю свою панель управления NVidia, выбираю графический процессор в качестве предпочтительного процессора и перезапускаю образец, я получаю информацию для своего графического процессора в desc - и это правильно! А также, когда я пытаюсь перечислить выходные данные для этого адаптера, я обнаружил, что есть хотя бы один.
У меня вопрос: есть ли способ сделать это программно, как в DirectX 11 SDK, чтобы мне не приходилось устанавливать настройки на моей панели управления NVidia?
Я просмотрел код SDK (для EmptyProject11) и каким-то образом они "захватывают" графический процессор вместо чипа Intel. Я закомментировал весь код в функции WinMain и вставил приведенный выше код, и он все еще захватил графический процессор! Это как-то связано с настройкой проекта, переменными среды, аргументами командной строки или...? Я имею в виду, как они это делают!?!?!?
Я был бы признателен за понимание этого вопроса.
Спасибо
1 ответ
Вы можете просмотреть все представленные адаптеры и получить информацию о них, просматривая все возможные адаптеры, используя ту же функцию, которую вы уже используете:
HRESULT r = S_OK;
unsigned int adapterindex = 0;
std::unique_ptr<IDXGIAdapter, ReleaseDirectX> dxgiadapter = null;
// Save the result of EnumAdapters to r, and then check if it's S_OK
while ( ( r = factory->EnumAdapters( adapterindex, &dxgiadapter ) ) == S_OK ) {
++adapterindex;
/* Work with your adapter here, particularly DXGI_ADAPTER_DESC */
}
Как правило, вам нужно будет автоматически выбрать один из них по умолчанию или перечислить все из них, и в какой-то панели настроек пусть пользователь выберет. Другой способ сделать это - использовать описание адаптера, у которого больше всего видеопамяти. Это не надежная эвристика, но я использую ее, чтобы получить "лучшую" (широко используемую) видеокарту для системы. Однако чаще всего по умолчанию используется значение по умолчанию.
Удачи!