С Новым годом! Форум программистов, компьютерный форум, киберфорум
DirectX
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Эксперт С++
3701 / 2835 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 22
1

В какой момент видеокарта обращается к Feature Level?

28.01.2022, 10:11. Показов 1563. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вопрос скорее теоретический, нежели практический. Мне просто лень писать вплоть до загрузки мешей и шейдеров и проверять.

Есть игра, которая использует D3D_FEATURE_LEVEL_11_1
И всё бы нечего, но меня прям выводит из себя вот это
В какой момент видеокарта обращается к Feature Level?


Разработчики определяют массив feature level
C++
1
2
3
D3D_FEATURE_LEVEL pFeatureLevels[2]{};
pFeatureLevels[0] = D3D_FEATURE_LEVEL_11_1;
pFeatureLevels[1] = D3D_FEATURE_LEVEL_11_0;
инициализируют тип драйвера как D3D_DRIVER_TYPE_UNKNOWN
В какой момент видеокарта обращается к Feature Level?

C++
1
2
D3D_DRIVER_TYPE DriverType{};
DriverType = D3D_DRIVER_TYPE_UNKNOWN;
Потому что используют в D3D11CreateDevice дескриптор адаптера
В какой момент видеокарта обращается к Feature Level?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if (CreateDXGIFactory1(IID_PPV_ARGS(pFactory.GetAddressOf())) != S_OK)
    exit(-1);
 
UINT i = 0;
std::vector <IDXGIAdapter*> vAdapters;
IDXGIAdapter1* pAdapters = nullptr;
while (pFactory->EnumAdapters1(i, &pAdapters) != DXGI_ERROR_NOT_FOUND) {
    vAdapters.push_back(pAdapters);
    ++i;
}
 
ComPtr<ID3D11Device> ppDevice;
ComPtr<ID3D11DeviceContext> ppImmediateContext;
if (D3D11CreateDevice(vAdapters[0], DriverType, nullptr, Flags, pFeatureLevels, ARRAYSIZE(pFeatureLevels),
    D3D11_SDK_VERSION, ppDevice.GetAddressOf(), &pFeatureLevel, ppImmediateContext.GetAddressOf()) != S_OK) exit(-1);
Затем работают со Swap Chain и определяют дескриптор окна через CreateSwapChainForHwnd
В какой момент видеокарта обращается к Feature Level?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
DXGI_SWAP_CHAIN_DESC1 swapChainDesc{};
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
swapChainDesc.SampleDesc.Count = 1;
swapChainDesc.BufferCount = 2;
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;
swapChainDesc.Scaling = DXGI_SCALING_NONE;
 
DXGI_SWAP_CHAIN_FULLSCREEN_DESC swapChainFullscreenDesc{};
swapChainFullscreenDesc.RefreshRate.Numerator = 60;
swapChainFullscreenDesc.RefreshRate.Denominator = 1;
    
pFactory->CreateSwapChainForHwnd(ppDevice.Get(), hWnd, &swapChainDesc, &swapChainFullscreenDesc, nullptr, pSwapChain.GetAddressOf());
Здесь же происходит инициализация DirectX 11.1 (ID3D11Device1 и ID3D11DeviceContext1)
C++
1
2
3
4
5
6
ComPtr<ID3D11Device1> ppDevice1;
ComPtr<ID3D11DeviceContext1> ppImmediateContext1;
ppDevice->QueryInterface(ppDevice1.GetAddressOf());
ppDevice.ReleaseAndGetAddressOf();
ppImmediateContext->QueryInterface(ppImmediateContext1.GetAddressOf());
ppImmediateContext.ReleaseAndGetAddressOf();
Перед дальнейшей обработкой разрабы ставят проверку на версию feature level
В какой момент видеокарта обращается к Feature Level?

C++
1
2
3
4
if (pFeatureLevel < D3D_FEATURE_LEVEL_11_1) {
    MessageBox(nullptr, TEXT("You need at least D3D_FEATURE_LEVEL_11_1."), TEXT("Version Not Supported"), NULL);
    exit(-1);
}
Соответственно, на видеокартах не поддерживающих D3D_FEATURE_LEVEL_11_1 вылетает эта ошибка и игра закрывается.

Итак, что делаю я - меняю в коде игры массив feature level на
C++
1
2
pFeatureLevels[0] = D3D_FEATURE_LEVEL_11_0;
pFeatureLevels[1] = D3D_FEATURE_LEVEL_11_0;
И переделываю проверку на уровня feature level на
C++
1
2
3
4
if (pFeatureLevel < D3D_FEATURE_LEVEL_11_1) {
    MessageBox(nullptr, TEXT("You need at least D3D_FEATURE_LEVEL_11_0."), TEXT("Version Not Supported"), NULL);
    exit(-1);
}
После этого игра запускается на видеокартах не поддерживающих D3D_FEATURE_LEVEL_11_1 но происходит кое-что странное:
есть отображение текста (меню, настройки и т.д.), есть отображение внутри игрового интерфейса (прокачка, очки и т.д.), есть звук, т.е. игра запущена и работает.
Но нет картинки - просто черный экран. Вывод буфера на экран не происходит из-за D3D_FEATURE_LEVEL_11_0.
Сам вывод я ещё не нашёл, но предполагаю там будет что-то такое с Depth Stencil
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void Render()
{
    ppImmediateContext1->OMSetRenderTargets(1, ppRenderTargetView.GetAddressOf(), ppDepthStencilView.Get());
 
    const float clearColor[4] = { 0.4f, 0.6f, 0.9f, 1.0f };
    ppImmediateContext1->ClearRenderTargetView(ppRenderTargetView.Get(), clearColor);
    ppImmediateContext1->ClearDepthStencilView(ppDepthStencilView.Get(), D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);
 
    ppImmediateContext1->RSSetViewports(1, &Viewport);
 
    DXGI_PRESENT_PARAMETERS PresentParam{};
    pSwapChain->Present1(1, 0, &PresentParam); // 1 - 60 fps; 0 - unlimited fps
}
Так вот у меня вопрос - что в API DirectX 11.1 (какие api функции) прям жестко завязано на аппаратном уровне D3D_FEATURE_LEVEL_11_1 ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.01.2022, 10:11
Ответы с готовыми решениями:

[SlimDX] DirectX 11 feature level
Собственно вопрос: как программируя DirectX 11 использовать feature level 9.х? если можно то на...

Определение к какому файлу в данный момент времени обращается та или иная программа
Как на ++ определить - к какому файлу в данный момент времени обращается та или иная программа?

Какой процесс обращается к файлу
Можно ли как-нибудь в .NET поймать не только событие об изменении/создании/удалении файла, но и PID...

Самая мощная видеокарта на данный момент
здравствуйте знатоки !!!!! Я бы хотел узнать какая самая мощная видеокарта на данный момент имеется...

Какой момент не учитывает программа?
Здравствуйте. Задача - http://acm.timus.ru/problem.aspx?space=1&amp;num=1025 Не могу успокоиться,...

3
Эксперт С++
3701 / 2835 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 22
28.01.2022, 10:22  [ТС] 2
Там ошибся, переделываю проверку соответственно на
C++
1
2
3
4
if (pFeatureLevel < D3D_FEATURE_LEVEL_11_0) { // здесь D3D_FEATURE_LEVEL_11_0
    MessageBox(nullptr, TEXT("You need at least D3D_FEATURE_LEVEL_11_0."), TEXT("Version Not Supported"), NULL);
    exit(-1);
}
0
Модератор
Эксперт Java
2698 / 1197 / 386
Регистрация: 11.08.2017
Сообщений: 3,702
Записей в блоге: 2
28.01.2022, 10:28 3

Не по теме:

Судя по активности этого раздела и уровню вопросов маловероятно что найдутся те кто ответят.


А whats new новой версии никак не помогает?
Человеческим языком можно прокомментировать так — новый DX11.1 проверяет совместимость 3D устройств и контролирует вычисления в шейдере, позволяя на любом этапе вмешиваться в ход расчетов. Добавлены новые команды копирования, защита от переполнения буферов, а сами константы увеличены.
Как минимум использовать в качестве отправной точки.
1
Эксперт С++
3701 / 2835 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 22
28.01.2022, 10:40  [ТС] 4

Не по теме:

alecss131, да, топик совсем неактивный, раньше (во времена XNA и перехода с DirectX 9 на новые версии) конечно тут было больше программистов.
Я сначала думал может написать тему где-то в ассемблере или в WinAPI, но вопрос как раз про графический API, поэтому решил сюда.



Я начал переписывать инициализацию API DirectX, основываясь на дизассемблирование кода игры, пытаясь понять в какой момент я получу черный экран.
Написал много, фактически весь движок без конвейера рендеринга, т.к. очень не хочется заниматься шейдерами.
Что интересно модель шейдеров 5.0 поддерживается обоими версиями feature level, но видимо где-то в глубинах API на аппаратном уровне есть концептуальная разница между 11_0 и 11_1.

По хорошему надо попробовать дописать конвейер и посмотреть что получится.
0
28.01.2022, 10:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.01.2022, 10:40
Помогаю со студенческими работами здесь

В какой момент уничтожится объект?
есть функция function Tdm.GetTypeList: TStringList; var AdoSet : TADOQuery; begin AdoSet...

В какой момент вывести лог
Всем привет. Начинаю изучать js и практически сразу встрял на одном моменте. server.js var http =...

В какой момент вода вытечет полностью?
У дна бака расположен кран. Когда кран открыли, вода начала вытекать, высота столба меняется по...

В какой момент происходит перехват запроса
Изучаю Django. В данный момент staticfiles. Так вот, вроде всё понятно, за исключением одного...

В какой момент срабатывает ограничение CHECK?
Есть функция CheckValue(Num,Name), которая возвращает 1 в случае наличия совокупности Номера и...

В какой момент Проведение запоминает данные?
Добрый день Подскажите в какой момент (Процедуре) проведение запоминает данные ? у меня есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru