Stop Staring At the Shadows
-
Автор темы
- #1
Всем привет, решил немного рассказать про подгрузку текстур, так как многие новички просто не понимают что они делают, как они это делают, и откуда вообще появляются ошибки в рендере от картинок. Я видел парочку гайдов все они показывают либо очень сжато, либо вообще в 90% показывают новичкам ошибочный код, который сработает сейчас, но потянет за собой вагон проблем в будущем, и как по мне, всё как-то непонятно для самых сырых новичков которые захотели посмотреть что вообще из себя представляет ImGui. В этом гайде я покажу сам рендер со стороны различных DirectX-а, без какой-то лишней запары, покажу частые ошибки при инициализации, и разберёмся с самим выводом картинки в меню.
Инициализируйте LoadImages() под кодом CreateDeviceD3D в main функции.
Initialize LoadImages() under the CreateDeviceD3D in the main function.
Inside ImGui::Begin() | Внутри ImGui::Begin()
Result:
Инициализируйте LoadImages() под кодом CreateDeviceD3D в main функции.
Initialize LoadImages() under the CreateDeviceD3D in the main function.
Inside ImGui::Begin() | Внутри ImGui::Begin()
Result:
Да, я знаю что подобных гайдов существует довольно много, но выше я попытался разобрать каждый шаг и отметить частые ошибки.
Всем спасибо за внимание, надеюсь кому-то этот гайд хоть как-то поможет в дальнейших приключениях по ImGui, заранее спасибо всем шарящим и не шарящим за попкорны, а новичкам желаю удачи.
А моё сообщение к гайдерам, которые не знают о чем они говорят таково - Не пишите гайды вообще, если вы не понимаете о чем вы говорите и предоставляете людям неправильный, ошибочный материал, неспособный для дальнейшего освоения.
RU:
Перед началом работы, нам необходимо загрузить себе на пк SDK от DirectX, что вы сможете сделать по данной ссылке
Открываем ту папку куда вы установили SDK -> переходим в папку Include, щелкаем ПКМ на любой из файлов, открываем свойства и копируем его путь от начала до конца (без имени файла).
Как должно быть - "C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include", как НЕ должно быть:
1 - "C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include\d3d9types.h (или любое другое название файла)"
2 - "C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)"
Далее необходимо открыть свойства проекта, и перейти по дальнейшему пути "Свойства->Каталоги VC++->Включаемые каталоги (2 строчка, у меня на англ просто)" - вставляем в начало строки тот путь Include что мы скопировали выше, свойства проекта пока что не закрывайте, читайте далее.
Так же нам необходимо подгрузить библиотеки, делаем то же самое что и с Include, открываем папку где установлен наш SDK и переходим в папку под названием Lib, инструкции те же что и раньше, но с другим путём.
Скопированный путь с папки "Lib" нам необходимо вставить в "Свойства->Каталоги VC++->Каталоги включаемых библиотек".
После скачивания нам необходимо прописать все необходимые инклуды в своём проекте, в примере каждого DirectX ниже это будет показано.
Сделал? Пошли дальше.
EU:
Before starting our work, we need to download the SDK from DirectX to our PC, which you can do using this link
Download, install WITHOUT changing the installation path (to avoid further errors), wait.
Open the folder where you installed the SDK -> go to the Include folder, click on any of the files, open the properties and copy its path from beginning to end (without the file name).
How it should be- "C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include", as it should NOT be:
1 - "C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include\d3d9types.h (or any other file name)"
2 - "C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)"
Next, you need to open the project properties, and go to the further path "Properties-> VC++ Directories->Include Directories" - insert at the beginning of the line the Include path that we copied above, do not close the project properties yet, read on.
We also need to load the libraries, do the same as with Include, open the folder where our SDK is installed and go to the folder called Lib, the instructions are the same as before, but with a different path.
We need to paste the copied path from the "Lib" folder into "Properties->VC++ Directories->Directories of included libraries".
After downloading, we need to register all the necessary includs in our project, this will be shown in the example of each DirectX below.
Let's move on.
Перед началом работы, нам необходимо загрузить себе на пк SDK от DirectX, что вы сможете сделать по данной ссылке
Пожалуйста, авторизуйтесь для просмотра ссылки.
Качаем, устанавливаем НЕ изменяя путь установки (во избежание дальнейших ошибок), ждём.Открываем ту папку куда вы установили SDK -> переходим в папку Include, щелкаем ПКМ на любой из файлов, открываем свойства и копируем его путь от начала до конца (без имени файла).
Как должно быть - "C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include", как НЕ должно быть:
1 - "C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include\d3d9types.h (или любое другое название файла)"
2 - "C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)"
Далее необходимо открыть свойства проекта, и перейти по дальнейшему пути "Свойства->Каталоги VC++->Включаемые каталоги (2 строчка, у меня на англ просто)" - вставляем в начало строки тот путь Include что мы скопировали выше, свойства проекта пока что не закрывайте, читайте далее.
Так же нам необходимо подгрузить библиотеки, делаем то же самое что и с Include, открываем папку где установлен наш SDK и переходим в папку под названием Lib, инструкции те же что и раньше, но с другим путём.
Скопированный путь с папки "Lib" нам необходимо вставить в "Свойства->Каталоги VC++->Каталоги включаемых библиотек".
После скачивания нам необходимо прописать все необходимые инклуды в своём проекте, в примере каждого DirectX ниже это будет показано.
Сделал? Пошли дальше.
EU:
Before starting our work, we need to download the SDK from DirectX to our PC, which you can do using this link
Пожалуйста, авторизуйтесь для просмотра ссылки.
Download, install WITHOUT changing the installation path (to avoid further errors), wait.
Open the folder where you installed the SDK -> go to the Include folder, click on any of the files, open the properties and copy its path from beginning to end (without the file name).
How it should be- "C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include", as it should NOT be:
1 - "C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include\d3d9types.h (or any other file name)"
2 - "C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)"
Next, you need to open the project properties, and go to the further path "Properties-> VC++ Directories->Include Directories" - insert at the beginning of the line the Include path that we copied above, do not close the project properties yet, read on.
We also need to load the libraries, do the same as with Include, open the folder where our SDK is installed and go to the folder called Lib, the instructions are the same as before, but with a different path.
We need to paste the copied path from the "Lib" folder into "Properties->VC++ Directories->Directories of included libraries".
After downloading, we need to register all the necessary includs in our project, this will be shown in the example of each DirectX below.
Let's move on.
RU:
Первым делом что-бы не ебаться с сайтами типо tomeko, давайте скачаем генератор файлов в байты.
Создаём папку, в неё переносим исполняемый файл генератора байтов, и туда же закидываем любую картинку для старта, далее перетаскиваем картинку прямо на генератор байтов, ждём самостоятельного закрытия консоли от программы.
Открываем файл .h и переносим его к себе в проект.
P.S. данное действие работает не только с картинками, шрифты тоже можно генерировать подобным образом.
А теперь давайте перейдём к самим примерам рендера.
EU:
First of all, in order not to fuck with sites like tomeko, let's download a file generator in bytes.
Create a folder, transfer the executable file of the byte generator to it, and throw any picture there to start, then drag the picture directly to the byte generator, wait for the console to close independently from the program.
Open the file .h and transfer it to our project
P.S. this action works not only with pictures, fonts can also be generated in a similar way
And now let's move on to the render examples themselves.
Первым делом что-бы не ебаться с сайтами типо tomeko, давайте скачаем генератор файлов в байты.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Создаём папку, в неё переносим исполняемый файл генератора байтов, и туда же закидываем любую картинку для старта, далее перетаскиваем картинку прямо на генератор байтов, ждём самостоятельного закрытия консоли от программы.
Открываем файл .h и переносим его к себе в проект.
P.S. данное действие работает не только с картинками, шрифты тоже можно генерировать подобным образом.
А теперь давайте перейдём к самим примерам рендера.
EU:
First of all, in order not to fuck with sites like tomeko, let's download a file generator in bytes.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Create a folder, transfer the executable file of the byte generator to it, and throw any picture there to start, then drag the picture directly to the byte generator, wait for the console to close independently from the program.
Open the file .h and transfer it to our project
P.S. this action works not only with pictures, fonts can also be generated in a similar way
And now let's move on to the render examples themselves.
includes:
#include "image.h"
#include <d3d11.h>
#include <D3DX11.h>
#pragma comment (lib, "d3dx11.lib")
DirectX 11:
ID3D11ShaderResourceView* Logotype = nullptr;
void LoadImages()
{
D3DX11_IMAGE_LOAD_INFO iInfo;
ID3DX11ThreadPump* threadPump{ nullptr };
// From Bytes
D3DX11CreateShaderResourceViewFromMemory(g_pd3dDevice, Logo/[I]from image.h[/I]/, sizeof(Logo/[I]from image.h[/I]/), &iInfo, threadPump, &Logotype/[I]shader[/I]/, 0);
//
// From file
D3DX11CreateShaderResourceViewFromFile(g_pd3dDevice, "D:\\GameLoaderDesign\\Images\\Witcher\\Witcher3Background.png" /[I]your path[/I]/, &iInfo, threadPump, &Logotype2, 0);
//
}
Initialize LoadImages() under the CreateDeviceD3D in the main function.
Inside ImGui::Begin() | Внутри ImGui::Begin()
ImGui Render:
ImVec2 pos = ImGui::GetWindowPos();
ImDrawList* draw = ImGui::GetWindowDrawList();
draw->AddImageRounded(Logotype, ImVec2(pos.x + 160 /[I]position X[/I]/, pos.y + 120 /[I]position Y[/I]/),
ImVec2(pos.x + 480 /[I]size X[/I]/ + 160 /[I]position X[/I]/, pos.y + 320 /[I]size Y[/I]/ + 120 /[I]position Y[/I]/),
ImVec2(0, 0), ImVec2(1, 1), ImColor(255, 255, 255, 255) /[I]color[/I]/, 10 /[I]rounding[/I]/);
Result:
Пожалуйста, авторизуйтесь для просмотра ссылки.
includes:
#include <d3d9.h>
#include <d3dx9.h>
#include "image.h"
#pragma comment (lib, "d3dx9.lib")
DirectX 9:
IDirect3DTexture9* Logotype = nullptr;
PDIRECT3DTEXTURE9 Logotype2 = nullptr;
void LoadImages() {
// From memory (bytes)
D3DXCreateTextureFromFileInMemory(g_pd3dDevice, &Logo, sizeof(Logo), &Logotype);
// From file
D3DXCreateTextureFromFileA(g_pd3dDevice, "D:\\GameLoaderDesign\\Images\\Witcher\\Witcher3Background.png", &Logotype2);
}
Initialize LoadImages() under the CreateDeviceD3D in the main function.
Inside ImGui::Begin() | Внутри ImGui::Begin()
ImGui Render:
ImVec2 pos = ImGui::GetWindowPos();
ImDrawList* draw = ImGui::GetWindowDrawList();
draw->AddImageRounded(Logotype, ImVec2(pos.x + 160 /[I]position X[/I]/, pos.y + 120 /[I]position Y[/I]/),
ImVec2(pos.x + 480 /[I]size X[/I]/ + 160 /[I]position X[/I]/, pos.y + 320 /[I]size Y[/I]/ + 120 /[I]position Y[/I]/),
ImVec2(0, 0), ImVec2(1, 1), ImColor(255, 255, 255, 255) /[I]color[/I]/, 10 /[I]rounding[/I]/);
Пожалуйста, авторизуйтесь для просмотра ссылки.
Left - DirectX9
Right - DirectX11
RU:
Как мы можем увидеть на скрине выше (или не можем, если не видите, то я напишу вам так), рендер текстуры через DirectX11 показывает себя намного лучше со стороны качества, нет такой заметной размытости как на картинке от DirectX9, в общем картинка от DirectX11 выглядит как от исходника, в то время как DirectX9 заметно её размывает.
EU:
As we can see in the screenshot above (or we can't, if you don't see it, then I'll write to you like this), the texture rendering via DirectX11 shows itself much better from the quality side, there is no such noticeable blurring as in the picture from DirectX9, in general, the picture from DirectX11 looks like from the source, while DirectX9 blurs it noticeably.
Right - DirectX11
Пожалуйста, авторизуйтесь для просмотра ссылки.
RU:
Как мы можем увидеть на скрине выше (или не можем, если не видите, то я напишу вам так), рендер текстуры через DirectX11 показывает себя намного лучше со стороны качества, нет такой заметной размытости как на картинке от DirectX9, в общем картинка от DirectX11 выглядит как от исходника, в то время как DirectX9 заметно её размывает.
EU:
As we can see in the screenshot above (or we can't, if you don't see it, then I'll write to you like this), the texture rendering via DirectX11 shows itself much better from the quality side, there is no such noticeable blurring as in the picture from DirectX9, in general, the picture from DirectX11 looks like from the source, while DirectX9 blurs it noticeably.
RU:
Недавно выполнял работу, и перенося исходник другого человека в сурс заказчика по его просьбе (оба исходника мне предоставили), заказчик столкнулся с подобной ошибкой и задавал мне вопрос -
Очень и очень часто замечаю у людей в исходниках, гайдах и т.д. ошибку, использование в десктопных дизайнах, лоадерах Extended функций DirectX рендера, вы можете спросить: "В чём проблема, какая может быть разница между D3DXCreateTextureFromFileInMemory и D3DXCreateTextureFromFileInMemoryEx, они же одинаковы по результату, что за доёб".
Ответ: Нет, в данном случае использование Extended функции для рендера на десктопном приложении строго не советуется и не приветствуется, существует тысяча и одно условие, при котором рендер Extended картинки просто крашнет вам весь рендер на моменте ResetDevice-а, например. Самые известные действия которые вызывают краш - сворачивание приложения (да, просто свернуть - вас крашнет), и смена разрешения рабочего стола.
Поэтому я искренне от себя рекомендую использовать нормальный рендер картинок, который я предоставил выше, во избежание дальнейших ошибок.
UPD: недавно проводил небольшое сравнение для себя, и обнаружил что Extended функция (конкретно DirectX9) имеет качество рендера заметно выше чем простая функция создания текстуры, то есть текстура на выходе получается почти что как у исходника, в то время как простой рендер текстуры, её немного размывает.
EU:
Recently I was doing work, and transferring the source code of another person to the customer's source at his request (both sources were provided to me), the customer encountered a similar error and asked me a question -
Very, very often I notice an error in people's sources, guides, etc., the use of DirectX Extended rendering functions in desktop designs, loaders, you can ask: "What is the problem, what can be the difference between D3DXCreateTextureFromFileInMemory and D3DXCreateTextureFromFileInMemoryEx, they are the same in result, what the fuck are you talking about."
Answer: No, in this case, the use of the Extended function for rendering on a desktop application is strictly not advised and is not welcome, there are a thousand and one conditions under which the Extended image render will simply crash the entire render at the moment of ResetDevice, for example. The most famous actions that cause a crash are minimizing the application (yes, just collapse - you will crash), and changing the desktop resolution.
Therefore, I sincerely recommend using the normal rendering of images that I provided above, in order to avoid further errors.
Недавно выполнял работу, и перенося исходник другого человека в сурс заказчика по его просьбе (оба исходника мне предоставили), заказчик столкнулся с подобной ошибкой и задавал мне вопрос -
Пожалуйста, авторизуйтесь для просмотра ссылки.
, моя работа заключалась только в правильном переносе, а не фиксе ошибок рендера исходника, т.к. это мы не обсуждали. Так у меня ещё и осталось такое ощущение, что я получил упрёк, как будто это моя ошибка, ошибка того кто переносил с одного сурса на другой, а не ошибка того человека что постил подобный исходник.Очень и очень часто замечаю у людей в исходниках, гайдах и т.д. ошибку, использование в десктопных дизайнах, лоадерах Extended функций DirectX рендера, вы можете спросить: "В чём проблема, какая может быть разница между D3DXCreateTextureFromFileInMemory и D3DXCreateTextureFromFileInMemoryEx, они же одинаковы по результату, что за доёб".
Ответ: Нет, в данном случае использование Extended функции для рендера на десктопном приложении строго не советуется и не приветствуется, существует тысяча и одно условие, при котором рендер Extended картинки просто крашнет вам весь рендер на моменте ResetDevice-а, например. Самые известные действия которые вызывают краш - сворачивание приложения (да, просто свернуть - вас крашнет), и смена разрешения рабочего стола.
Поэтому я искренне от себя рекомендую использовать нормальный рендер картинок, который я предоставил выше, во избежание дальнейших ошибок.
UPD: недавно проводил небольшое сравнение для себя, и обнаружил что Extended функция (конкретно DirectX9) имеет качество рендера заметно выше чем простая функция создания текстуры, то есть текстура на выходе получается почти что как у исходника, в то время как простой рендер текстуры, её немного размывает.
EU:
Recently I was doing work, and transferring the source code of another person to the customer's source at his request (both sources were provided to me), the customer encountered a similar error and asked me a question -
Пожалуйста, авторизуйтесь для просмотра ссылки.
, my job was only to transfer correctly, and not fix the source rendering errors, because we did not discuss this. So I still have the feeling that I received a reproach, as if it was my mistake, the mistake of the one who transferred from one source to another, and not the mistake of the person who posted such a source.Very, very often I notice an error in people's sources, guides, etc., the use of DirectX Extended rendering functions in desktop designs, loaders, you can ask: "What is the problem, what can be the difference between D3DXCreateTextureFromFileInMemory and D3DXCreateTextureFromFileInMemoryEx, they are the same in result, what the fuck are you talking about."
Answer: No, in this case, the use of the Extended function for rendering on a desktop application is strictly not advised and is not welcome, there are a thousand and one conditions under which the Extended image render will simply crash the entire render at the moment of ResetDevice, for example. The most famous actions that cause a crash are minimizing the application (yes, just collapse - you will crash), and changing the desktop resolution.
Therefore, I sincerely recommend using the normal rendering of images that I provided above, in order to avoid further errors.
Да, я знаю что подобных гайдов существует довольно много, но выше я попытался разобрать каждый шаг и отметить частые ошибки.
Всем спасибо за внимание, надеюсь кому-то этот гайд хоть как-то поможет в дальнейших приключениях по ImGui, заранее спасибо всем шарящим и не шарящим за попкорны, а новичкам желаю удачи.
А моё сообщение к гайдерам, которые не знают о чем они говорят таково - Не пишите гайды вообще, если вы не понимаете о чем вы говорите и предоставляете людям неправильный, ошибочный материал, неспособный для дальнейшего освоения.
Последнее редактирование: