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 вам необходимо сделать следующее:

  1. Получить дескриптор ОС для объекта с допустимым контекстом устройства

    Это может быть окно ОС или битмап ОС. Если у вас только консольное приложение, вам нужно сначала создать действительное окно ОС и использовать его дескриптор (насколько мне известно, в консоли нет Canvas).

    вы можете использовать GLUT для создания окна или, если у вашей IDE компилятора есть окно приложения, вы можете использовать это. Вы также можете комбинировать компоненты OpenGL и Window. VCL также не проблема (я использую его годами с OpenGL)

    В Windows вы можете использовать CreateWindowEx, так что Goo gle пример для этого...

    В любом случае вы должны иметь свой дескриптор в переменной, как:

    HWND hwin=NULL;
    

    Если у вас нет опыта работы с Windows-приложениями, используйте GLUT для этого. В противном случае вам нужно было бы изучить много всего, чтобы охватить создание окон, обработку сообщений и взаимодействие между пользователем и приложением, что может быть очень сложно для новичка без руководства.

  2. Получить контекст устройства для этого дескриптора

    HDC hdc = GetDC(hwin);
    
  3. Установите необходимый вам формат пикселя контекста устройства

    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);
    
  4. Создать контекст рендеринга OpenGL для контекста устройства

    HGLRC hrc = wglCreateContext(hdc);
    
  5. Установите его как контекст OpenGL по умолчанию

    wglMakeCurrent(hdc, hrc);
    

Это абсолютный минимум без какой-либо проверки ошибок, дополнительных буферов и т. Д. Для получения дополнительной информации и фактического кода см. Соответствующие QA:

Вы можете использовать GLUT для всего этого. Это первый хит, который я нашел в результате быстрого поиска:

Или следуйте инструкциям OpenGL, их множество...

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