Renderuj zarysowany czerwony prostokąt na wierzchu tekstury 2D w OpenGL

Szukałem dużo tej strony, ale nie mogłem dokładnie określić, jaki jest dokładnie mój problem. Większość podobnych problemów wykorzystywała konsolę i bibliotekę glut. Ale ponieważ jestem nowy w OpenGL i MFC i zacząłem go od kombinacji MFC, nie mogli mi pomóc.

Dostosowuję klasęCOpenGLcontrol tutaj w codeguru dla własnych celów.Oto pełna dostosowana klasa ale jeśli nie jesteś zainteresowany pobraniem, nie będę miał problemu z wyjaśnieniem powiązanych części. To może chwilę potrwać, więc mam nadzieję, że będziesz cierpliwy!

Przede wszystkim powinienem powiedzieć, że moim celem jest narysowanie takiego prostokąta, ponieważ chcę utworzyć dwa wystąpienia klasy w moim programie.
w mniejszym oknie obraz zawsze byłby wzoom extent ale w większym użytkownik ma możliwość wykonywania różnych zadań nawigacyjnych. Za każdym razem, gdy na przykład obraz jest przesuwany lub powiększanyOnDraw funkcja większej instancjithe extent rectangle zostanie obliczony i przekazany do mniejszego okna i tam narysowanygdzie jesteśmy na całym tak dużym obrazie

Wykonałem następujące kroki:
Modyfikowanie stosu macierzy projekcji i symulowanie sceny 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);
}  

Modyfikowanie stosu macierzy modelu i ustawianie kamery (wygląda na to, że patrzymy w kierunku ujemnym osi 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);
}  

liniasetViewRectangle() jest dla komputerówvector<int>ViewRectangle jeden z danych publicznych członka klasy i jeśli użytkownik chce,vector<int>RectangleToDraw inne publiczne dane członkowskie zostaną użyte do narysowania prostokąta. Dzieje się tak, ponieważ w dużym oknie nie chcemy rysować takiego prostokąta, ale w mniejszym mamy. A mniejszy wykorzysta dane większego.Ale nie wdrożyłem jeszcze sposobu przekazywania tych danych w czasie rzeczywistym między dwoma instancjami klasy!
Tak więc w momencie wypróbowania klasy ustawiłem początkową wartośćRectangleToDraw w następujący sposób i ponieważ okno jest[0,0,573,543] ustawiony przezglOrtho, Myślę, że prostokąt powinien być narysowany w środku, na górze tekstury. Ale tak nie jest.
tak czy inaczej
Kod, aby zastosować teksturę, która zostanie wywołana w 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);
}  

Kod do obliczeniaViewRectangle które zostaną przekazane do innej instancji klasy

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;
}  

Kod, aby narysować prostokąt na górze tekstury

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);
}  

nawet używającglVertex2f w powyższej funkcji nie ma znaczenia i w obu okolicznościach napotykam:

Nie bądź zdezorientowany. Powodem, dla którego niewłaściwy rysunek jest stosowany w obu oknach, jest to, że ustawiłem w konstruktorze:

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

tylko do wypróbowania, jak narysować prostokąt na górze tekstury. Z pewnością po napisaniu poprawnego kodu ustawię je w trybie prawdziwym. Po prostu mi powiedz

Jak narysować prostokąt na górze tekstury, najlepiej w sposób zorientowany obiektowo, aby uzyskać renderowanie w czasie rzeczywistym?

questionAnswers(1)

yourAnswerToTheQuestion