Хотите пример OpenGL 2D (VC ++, нарисуйте прямоугольник) - PullRequest
5 голосов
/ 04 мая 2011

Я хочу создать высокопроизводительную 2D-программу.

Я использую VC ++ 2008.Предположим, я создал главное окно.Я хочу нарисовать красный прямоугольник (вверху слева: 10,20, внизу справа: 200, 300) в клиентской области главного окна, как это делает API FillRect (), но с использованием OpenGL.

void InitOpenGL(HWND hwnd)
{
.... // What should I do?
     // Only for 2D drawing, and the (0,0) should be the top left point.
}

// the function below will be called in the WM_PAINT handler
void DrawRectWithOpenGL(RECT* pRect)
{
.... // What should I do?
}

EDIT1: есть ли в OpenGL API для 2D-рисования или библиотека, например Direct2D / DirectWrite?

Ответы [ 2 ]

9 голосов
/ 04 мая 2011

Я настоятельно рекомендую вам взглянуть на некоторые учебные пособия по OpenGL (http://nehe.gamedev.net/ - хороший сайт, он расскажет вам все, что вам нужно знать), но при условии, что в вашем коде правильно настроен OpenGL,вы бы сделали что-то подобное в своей функции DrawRectWithOpenGL (я не программист на C ++, но я думаю, что мой код выглядит правильно для C ++):

void DrawRectWithOpenGL(RECT* pRect)
{
  glPushMatrix();  //Make sure our transformations don't affect any other transformations in other code
    glTranslatef(pRect->x, pRect->y, 0.0f);  //Translate rectangle to its assigned x and y position
    //Put other transformations here
    glBegin(GL_QUADS);   //We want to draw a quad, i.e. shape with four sides
      glColor3f(1, 0, 0); //Set the colour to red 
      glVertex2f(0, 0);            //Draw the four corners of the rectangle
      glVertex2f(0, pRect->h);
      glVertex2f(pRect->w, pRect->h);
      glVertex2f(pRect->w, 0);       
    glEnd();
  glPopMatrix();
}

OpenGL не имеет API для 2D-рисования, но еголегко делать 2D-вещи, просто игнорируя ось Z (или просто используя ось Z, чтобы удостовериться, что спрайты нарисованы на правильной глубине, то есть вы можете нарисовать фон после переднего плана, потому что глубина фона установлена ​​так, что он находится позадина переднем плане).Надеюсь это поможет.Определенно найдите время, чтобы взглянуть на некоторые учебные пособия, и все станет ясно.

РЕДАКТИРОВАТЬ : для настройки OpenGL для 2D-чертежа необходимо настроить ортографическую проекцию (учебные пособия, которыеЯ связан с использует перспективную проекцию, извините, что не упомянул это).Вот пример некоторого моего кода, который делает это (который должен быть где-то в вашей функции InitOpenGL, после того, как вы создали свое окно):

glClearColor(0.0, 0.0, 0.0, 0.0);  //Set the cleared screen colour to black
glViewport(0, 0, screenwidth, screenheight);   //This sets up the viewport so that the coordinates (0, 0) are at the top left of the window

//Set up the orthographic projection so that coordinates (0, 0) are in the top left
//and the minimum and maximum depth is -10 and 10. To enable depth just put in
//glEnable(GL_DEPTH_TEST)
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, screenwidth, screenheight, 0, -10, 10);

//Back to the modelview so we can draw stuff 
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); //Clear the screen and depth buffer

Итак, это отсортированная инициализация.Вы должны иметь возможность использовать такие значения, как 100 и 200, чтобы они правильно отображались на экране, т. Е. Координаты указаны в пикселях.

Для обработки изменений размера окна вам нужно будет найти размер окна.(с использованием внешней библиотеки. Я не уверен, что вы можете сделать это в OpenGL, хотя glutGet (GLUT_WINDOW_WIDTH) и glutGet (GLUT_WINDOW_HEIGHT) из GLUT могут работать, но я не проверял это), а затем снова вызывать glViewport и glOrtho собновленный размер окна.

Опять же, вам придется использовать внешнюю библиотеку, чтобы точно узнать , когда размер окна изменится.Я не уверен, что вы могли бы использовать, хотя, если вы используете SDL, то для этого может потребоваться некоторая обработка событий (и может быть возможность вернуть ширину и высоту экрана, если glutGet не работает).

Надеюсь, это поможет!

3 голосов
/ 05 мая 2011

Спасибо, SuperMaximo93. Я наконец получил свой код на работу. Вот мой код на размер окна меняется. Функция ниже вызывается в обработчике WM_SIZE.

void OpenGlWindow::Resize(HWND hwnd)
{
    // Get new window size
    RECT rect;
    int width, height;

    GetClientRect(hwnd, &rect);
    width = rect.right;
    height = rect.bottom;

    glClearColor(0.0, 0.0, 0.0, 0.0);  //Set the cleared screen colour to black
    glViewport(0, 0, width, height);   //This sets up the viewport so that the coordinates (0, 0) are at the top left of the window

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    //Back to the modelview so we can draw stuff 
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glRotatef(180, 1.0f, 0, 0);
    glTranslatef(-1.0f, -1.0f, 0);
    glScalef(2.0f/width, 2.0f/height, 1);

    glTranslatef(2.0f, 2.0f, 0);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...