Renderiza un rectángulo rojo delineado en la parte superior de una textura 2D en OpenGL

He buscado mucho en este sitio pero no pude encontrar exactamente cuál es exactamente mi problema. La mayoría de los problemas similares habían utilizado la consola y la biblioteca de saturación. Pero como soy nuevo en OpenGL y MFC y lo empecé con la combinación de MFC, no pudieron ayudarme mucho.

Estoy personalizando la claseCOpenGLcontrol aquí en codeguru para mis propios fines.Aquí está la clase personalizada completa pero si no está interesado en descargarlo, no hay problema, le explicaré las partes relacionadas. Esto puede tomar un tiempo, ¡así que espero que seas paciente!

En primer lugar, debo decirles que mi objetivo de dibujar un rectángulo así es que, quiero crear dos instancias de la clase en mi programa.
en la ventana más pequeña la imagen siempre estaría en elzoom extent modo pero en el más grande, el usuario tiene la capacidad de realizar diferentes tareas de navegación. Así que cada vez que, por ejemplo, la imagen se desplaza o se amplía en elOnDraw función de la instancia más grandethe extent rectangle se computará y pasará a la ventana más pequeña y se dibujará allí para mostrar quedonde estamos en el conjunto de una imagen tan grande

He seguido estos pasos:
Modificando la matriz de proyección y simulando una escena 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);
}  

Modificación de la matriz de matriz de Modelview y configuración de la cámara (parece que estamos mirando hacia la dirección negativa del eje 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);
}  

la líneasetViewRectangle() es para computacionvector<int>ViewRectangle uno de los datos de miembros públicos de la clase y si el usuario lo desea, elvector<int>RectangleToDraw Se utilizarán otros datos de miembros públicos para dibujar el rectángulo. Esto se debe a que no queremos que en la ventana grande se dibuje un rectángulo así, sino en lo más pequeño que hacemos. Y los más pequeños usarán los datos de los más grandes.¡Pero todavía no he implementado cómo pasar estos datos en tiempo real entre dos instancias de una clase!
Así que a la hora de probar la clase, he establecido el valor inicial deRectangleToDraw de la siguiente manera y ya que la ventana es una[0,0,573,543] establecido porglOrtho, Creo que el rectángulo debe dibujarse en el centro, en la parte superior de la textura. Pero este no es el caso.
de todas formas
Código para aplicar la textura que se llamará en el 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);
}  

Código para calcularViewRectangle Eso será pasado a otra instancia de la clase.

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

Código para dibujar un rectángulo en la parte superior de la textura.

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

incluso usandoglVertex2f En la función anterior no hace ninguna diferencia y en ambas circunstancias, me encuentro con:

No te confundas. El motivo por el que se aplica un dibujo incorrecto en ambas ventanas es que he establecido en el constructor:

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

Sólo para probar cómo dibujar un rectángulo sobre una textura. Seguramente después de escribir el código correcto, los estableceré en el modo verdadero. Sólo dime

¿Cómo dibujar un rectángulo en la parte superior de una textura preferiblemente de tal manera orientada a objetos que necesito representación en tiempo real?

Respuestas a la pregunta(1)

Su respuesta a la pregunta