Рендеринг обведенного красным прямоугольника поверх 2D-текстуры в OpenGL

Я много раз искал этот сайт, но не смогне могу найти то, что является именно моей проблемой. В большинстве подобных проблем использовались консоль и библиотека перенасыщения. Но так как яЯ новичок в OpenGL и MFC и начал его с комбинации MFC, они не моглимне много не поможет.

м настраивая классCOpenGLcontrol здесь в кодегуру для моих собственных целей.Вот'S полный настроенный класс но если ты'не заинтересованы в загрузке, нет проблем, я объясню части, которые связаны. Это может занять некоторое время, поэтому я надеюсь, что вы будете терпеливы!

Прежде всего я должен сказать вам, что моя цель рисования такого прямоугольника заключается в том, что я хочу создать два экземпляра класса в моей программе.

в меньшем окне изображение всегда будет вzoom extent режим, но в большем, пользователь имеет возможность выполнять различные задачи навигации. Таким образом, каждый раз, когда, например, изображение панорамируется или масштабируется вOnDraw функция большего экземпляраthe extent rectangle будет вычислен и передан в меньшее окно и нарисован там, чтобы показать, чтогде мы в целом такой большой образ

Я следовал за этими шагами:

Модификация стека проекционной матрицы и симуляция 2D-сцены

void COpenGLControl::OnSize(UINT nType, int cx, int cy)
{
wglMakeCurrent(hdc, hrc);
CWnd::OnSize(nType, cx, cy);

if (0 >= cx || 0 >= cy || nType == SIZE_MINIMIZED) return;
oglWindowWidth = cx;
oglWindowHeight = cy;
// Map the OpenGL coordinates.
glViewport(0, 0, oglWindowWidth, oglWindowHeight);

// Projection view
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// Set our current view perspective
glOrtho(-oglWindowWidth/2, oglWindowWidth/2, -oglWindowHeight/2,oglWindowHeight/2, 1, -1);
// Model view
glMatrixMode(GL_MODELVIEW);
wglMakeCurrent(NULL, NULL);
}  

Изменение стека матрицы вида модели и настройка камеры (кажется, что мы смотрим в отрицательном направлении оси Z)

void COpenGLControl::OnDraw(CDC *pDC)
{
// TODO: Camera controls
wglMakeCurrent(hdc,hrc);
glLoadIdentity();
gluLookAt(0,0,1,0,0,0,0,1,0);
glTranslatef(m_fPosX, m_fPosY, 0.0f);
glScalef(m_fZoom,m_fZoom,1.0);
setViewRectangle();
if (WantToDrawRectangle)
    DrawRectangleOnTopOfTexture();
wglMakeCurrent(NULL, NULL);
}  

линияsetViewRectangle() для вычисленийvectorViewRectangle один из открытых данных члена класса, и если пользователь хочет,vectorRectangleToDraw другие открытые данные участника будут использоваться для рисования прямоугольника. Это потому что мы неЯ хочу, чтобы в большом окне нарисовать такой прямоугольник, но в меньшем мы делаем. И чем меньше будет использовать данные, тем больше.Но у меня нетДо сих пор реализовано, как передавать эти данные в режиме реального времени между двумя экземплярами класса!

Так что на время просто для того, чтобы попробовать класс, я установил начальное значениеRectangleToDraw следующим образом и так как окно[0,0,573,543] установленоglOrthoЯ думаю, прямоугольник должен быть нарисован в центре, на вершине текстуры. Но это не так.

тем не мение

Код для применения текстуры, которая будет вызываться в OnTimer

void COpenGLControl::oglDrawScene(void)
{
wglMakeCurrent(hdc, hrc);
float x0 = -ImageWidth/2; // top left corner of image
float y0 = ImageHeight/2;
float x1 = x0 + ImageWidth; // bottom right corner of image
float y1 = y0 - ImageHeight;

glBegin(GL_TRIANGLE_STRIP);
{
    glTexCoord2f(0,1);glVertex2f(x0, y1);
    glTexCoord2f(0,0);glVertex2f(x0, y0);
    glTexCoord2f(1,1);glVertex2f(x1, y1);
    glTexCoord2f(1,0);glVertex2f(x1, y0);
}
glEnd();
wglMakeCurrent(NULL, NULL);
}  

Код для вычисленияViewRectangle который будет передан другому экземпляру класса

void COpenGLControl::setViewRectangle()
{
ViewRectangle.at(0) = m_fPosX - oglWindowWidth*m_fZoomInverse/2;
ViewRectangle.at(1) = m_fPosY - oglWindowHeight*m_fZoomInverse/2;
ViewRectangle.at(2) = m_fPosX + oglWindowWidth*m_fZoomInverse/2;
ViewRectangle.at(3) = m_fPosY + oglWindowHeight*m_fZoomInverse/2;
}  

Код для рисования прямоугольника поверх текстуры

void COpenGLControl::DrawRectangleOnTopOfTexture()
{
wglMakeCurrent(hdc, hrc);
glColor3f(1.0f,0.0f,0.0f);
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
glBegin(GL_QUADS);
   glVertex3f(RectangleToDraw.at(0),RectangleToDraw.at(1),0.5);
   glVertex3f(RectangleToDraw.at(0),RectangleToDraw.at(3),0.5);
   glVertex3f(RectangleToDraw.at(2),RectangleToDraw.at(3),0.5);
   glVertex3f(RectangleToDraw.at(2),RectangleToDraw.at(1),0.5);
glEnd();
SwapBuffers(hdc);
wglMakeCurrent(NULL, NULL);
}  

даже используяglVertex2f в приведенной выше функции не имеет никакого значения, и в обоих случаях я сталкиваюсь:



Дон»запутаться Причина, по которой неправильный рисунок применяется к обоим окнам, заключается в том, что я установил в конструкторе:

WantToDrawRectangle = true;  
RectangleToDraw.at(0) = -100;
RectangleToDraw.at(1) = -100;
RectangleToDraw.at(2) = 100;
RectangleToDraw.at(3) = 100;  

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

Как нарисовать прямоугольник поверх текстуры предпочтительно таким объектно-ориентированным способом, что мне нужен рендеринг в реальном времени?

Ответы на вопрос(1)

Ваш ответ на вопрос