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 */
}

Как правило, вам нужно будет автоматически выбрать один из них по умолчанию или перечислить все из них, и в какой-то панели настроек пусть пользователь выберет. Другой способ сделать это - использовать описание адаптера, у которого больше всего видеопамяти. Это не надежная эвристика, но я использую ее, чтобы получить "лучшую" (широко используемую) видеокарту для системы. Однако чаще всего по умолчанию используется значение по умолчанию.

Удачи!

Другие вопросы по тегам