Renderizar um retângulo vermelho delineado em cima de uma textura 2D em OpenGL

Eu pesquisei muito neste site, mas não consegui encontrar exatamente o que é exatamente o meu problema. A maioria dos problemas semelhantes usava o console e a biblioteca de glut. Mas desde que eu sou novo no OpenGL e MFC e comecei com a combinação do MFC, eles não poderiam me ajudar muito.

Estou personalizando a classeCOpenGLcontrol aqui no codeguru para meus propósitos.Aqui está a aula completa personalizada mas se você não estiver interessado em fazer o download, não há problema em explicar as partes relacionadas. Isso pode demorar um pouco, então espero que você seja paciente!

Primeiro de tudo, devo dizer-lhe que o meu objetivo de desenhar um tal retângulo é que eu quero criar duas instâncias da classe no meu programa.
na janela menor a imagem estaria sempre nozoom extent modo, mas no maior, o usuário tem a capacidade de fazer diferentes tarefas de navegação. Assim, cada vez que, por exemplo, a imagem é panorâmica ou ampliadaOnDraw função do maior instânciathe extent rectangle será calculado e passado para a janela menor e desenhado lá para mostrar queonde estamos no conjunto de uma imagem tão grande

Eu segui estes passos:
Modificando a pilha de matriz de projeção e simulando uma cena 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);
}  

Modificando a pilha de matriz de visualização de modelos e definindo a câmera (parece que estamos olhando para a direção negativa do eixo 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);
}  

a linhasetViewRectangle() é para computaçãovector<int>ViewRectangle um dos dados do membro público da classe e, se o usuário quiser, ovector<int>RectangleToDraw outros dados de membros públicos serão usados ​​para desenhar o retângulo. Isto é porque não queremos na janela grande desenhar tal retângulo, mas nos menores nós fazemos. E o menor usará os dados do maior.Mas ainda não implementei como passar esses dados em tempo real entre duas instâncias de uma classe!
Então, a tempo apenas para experimentar a aula, eu defini o valor inicial deRectangleToDraw como segue e desde que a janela é um[0,0,573,543] estabelecido porglOrtho, Acho que o retângulo deve ser desenhado no centro, no topo da textura. Mas este não é o caso.
de qualquer forma
Código para aplicar a textura que será chamada no 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 que será passado para outra instância da classe

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 desenhar um retângulo em cima da 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);
}  

mesmo usandoglVertex2f na função acima não faz qualquer diferença e em ambas as circunstâncias, eu encontro:

Não fique confuso. A razão pela qual o desenho errado é aplicado em ambas as janelas é que eu configurei no construtor:

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

apenas para experimentar como desenhar um retângulo em cima de uma textura. Certamente, depois de escrever o código correto, vou configurá-los para o modo verdadeiro. Apenas me diga

Como desenhar um retângulo no topo de uma textura, de preferência de tal maneira orientada a objeto que eu preciso de renderização em tempo real?

questionAnswers(1)

yourAnswerToTheQuestion