OpenGL получить контекст устройства
Я пытаюсь создать приложение OpenGL на Windows. Насколько я понимаю, одной из первых вещей, которые я должен получить, является Контекст устройства, который должен быть передан паре функций, которые выбирают и устанавливают формат пикселей и создают контекст рендеринга. Я использовал OpenGL wiki, чтобы получить общее представление о том, что я должен делать. Мой код что-то вроде:
#include <iostream>
#include <windef.h>
#include <wingdi.h>
HDC hdc;
int main() {
hdc = wglGetCurrentDC();
std::cout << "HDC: " << hdc << std::endl;
return 0;
}
Это печатает
HDC: 0
Я предположил, что контекст устройства относится к физическому устройству, но я где-то читал, что он относится к любой нарисованной "поверхности". В обоих случаях мой вопрос: как я могу получить ненулевой DC? Или я должен выполнить совершенно другой набор шагов для настройки всей этой системы OpenGL?
Я нашел много учебных пособий в Интернете, но все они используют GLUT, GLEW, GLFW, X11, SDL и т. Д., Которые являются библиотеками. Библиотеки делают некоторые вещи проще, но они обычно не выполняют задачи, которые невозможно без их использования. На этот раз я хочу попытаться сделать что-то сложное и, следовательно, не использовать библиотеки, а просто OpenGL.
Наконец, я нашел учебник, в котором для создания окна использовались только библиотеки Windows.
1 ответ
Вы не указали свою ОС, но я предполагаю Windows из имен функций. Проблема именно в том, что Рето Коради заявил в комментарии. Для настройки OpenGL вам необходимо сделать следующее:
Получить дескриптор ОС для объекта с допустимым контекстом устройства
Это может быть окно ОС или битмап ОС. Если у вас только консольное приложение, вам нужно сначала создать действительное окно ОС и использовать его дескриптор (насколько мне известно, в консоли нет Canvas).
вы можете использовать GLUT для создания окна или, если у вашей IDE компилятора есть окно приложения, вы можете использовать это. Вы также можете комбинировать компоненты OpenGL и Window. VCL также не проблема (я использую его годами с OpenGL)
В Windows вы можете использовать CreateWindowEx, так что Goo gle пример для этого...
В любом случае вы должны иметь свой дескриптор в переменной, как:
HWND hwin=NULL;
Если у вас нет опыта работы с Windows-приложениями, используйте GLUT для этого. В противном случае вам нужно было бы изучить много всего, чтобы охватить создание окон, обработку сообщений и взаимодействие между пользователем и приложением, что может быть очень сложно для новичка без руководства.
Получить контекст устройства для этого дескриптора
HDC hdc = GetDC(hwin);
Установите необходимый вам формат пикселя контекста устройства
PIXELFORMATDESCRIPTOR pfd; ZeroMemory( &pfd, sizeof( pfd ) ); // set the pixel format for the DC pfd.nSize = sizeof( pfd ); pfd.nVersion = 1; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 24; pfd.cDepthBits = 24; pfd.iLayerType = PFD_MAIN_PLANE; SetPixelFormat(hdc,ChoosePixelFormat(hdc, &pfd),&pfd);
Создать контекст рендеринга OpenGL для контекста устройства
HGLRC hrc = wglCreateContext(hdc);
Установите его как контекст OpenGL по умолчанию
wglMakeCurrent(hdc, hrc);
Это абсолютный минимум без какой-либо проверки ошибок, дополнительных буферов и т. Д. Для получения дополнительной информации и фактического кода см. Соответствующие QA:
- Как сделать фрейм openGL в C++ builder? для старого стиля GL
- простой завершенный пример шейдеров GL+VAO/VBO+GLSL+ в C++ с новым материалом
Вы можете использовать GLUT для всего этого. Это первый хит, который я нашел в результате быстрого поиска:
Или следуйте инструкциям OpenGL, их множество...