Rendern Sie ein umrandetes rotes Rechteck über einer 2D-Textur in OpenGL

Ich habe viel auf dieser Site gesucht, konnte aber nicht genau herausfinden, was genau mein Problem ist. Die meisten ähnlichen Probleme hatten die Konsole und die Überfüllungsbibliothek verwendet. Aber da ich neu bei OpenGL und MFC bin und mit der Kombination von MFC angefangen habe, konnten sie mir nicht viel helfen.

Ich passe die Klasse anCOpenGLcontrol hier im Codeguru für meine eigenen Zwecke.Hier ist die vollständige angepasste Klasse aber wenn Sie nicht daran interessiert sind, es herunterzuladen, kein Problem, erkläre ich die Teile, die verwandt sind. Das kann eine Weile dauern, also hoffe ich, dass Sie Geduld haben!

Zunächst möchte ich Ihnen sagen, dass mein Ziel beim Zeichnen eines solchen Rechtecks ​​darin besteht, zwei Instanzen der Klasse in meinem Programm zu erstellen.

Ich habe diese Schritte befolgt:
Ändern des Projektionsmatrixstapels und Simulieren einer 2D-Szene

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

Modifizieren des Modelview-Matrixstapels und Einstellen der Kamera (es scheint, dass wir auf die negative Richtung der Z-Achse schauen)

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

die LiniesetViewRectangle()&nbsp;ist zum rechnenvector<int>ViewRectangle&nbsp;eines der öffentlichen Mitgliederdaten der Klasse und, wenn der Benutzer dies wünscht, dasvector<int>RectangleToDraw&nbsp;Andere öffentliche Mitgliederdaten werden zum Zeichnen des Rechtecks ​​verwendet. Dies liegt daran, dass wir nicht im großen Fenster ein solches Rechteck zeichnen möchten, sondern im kleineren. Und der kleinere verwendet die Daten des größeren.Ich habe jedoch noch nicht implementiert, wie diese Daten in Echtzeit zwischen zwei Instanzen einer Klasse übertragen werden sollen.
Also habe ich zum Ausprobieren der Klasse den Anfangswert von gesetztRectangleToDraw&nbsp;wie folgt und da das fenster a[0,0,573,543]&nbsp;beigelegt vonglOrthoIch denke, das Rechteck sollte in der Mitte oben auf der Textur gezeichnet werden. Dies ist jedoch nicht der Fall.
sowieso
Code zum Anwenden der Textur, die im OnTimer aufgerufen wird


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

Code zum BerechnenViewRectangle&nbsp;das wird an eine andere Instanz der Klasse übergeben

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

Code zum Zeichnen eines Rechtecks ​​über der Textur

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

sogar mitglVertex2f&nbsp;in der obigen Funktion macht keinen Unterschied und unter beiden Umständen stoße ich auf:

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

Nur zum Ausprobieren, wie man ein Rechteck über eine Textur zeichnet. Nachdem ich den richtigen Code geschrieben habe, werde ich sie auf den wahren Modus setzen. Sag's mir einfach

Wie zeichne ich ein Rechteck auf eine Textur, vorzugsweise so objektorientiert, dass ich in Echtzeit rendern muss?