texture - Renderice un rectángulo rojo delineado sobre una textura 2D en OpenGL
texture mapping opengl (1)
Como los edge flags
están en desuso en OpenGL moderno, evitaría usar un modo de relleno de polígono para dibujar los contornos. Si entiendo tu captura de pantalla correctamente, estás obteniendo líneas en los bordes interiores de los dos triángulos utilizados para dibujar tu rectángulo.
En su lugar, dibuje un GL_LINE_LOOP
rojo que use las 4 esquinas de su rectángulo ... esta es la técnica preferida por razones de portabilidad, ya que los GL_QUADS
también están en desuso.
glColor3f (1.0f, 0.0f, 0.0f);
glBegin (GL_LINE_LOOP);
glVertex3f (RectangleToDraw.at (0), RectangleToDraw.at (1), -1.0f);
glVertex3f (RectangleToDraw.at (0), RectangleToDraw.at (3), -1.0f);
glVertex3f (RectangleToDraw.at (2), RectangleToDraw.at (3), -1.0f);
glVertex3f (RectangleToDraw.at (2), RectangleToDraw.at (1), -1.0f);
glEnd ();
Además, su captura de pantalla parece estar sufriendo al intentar texturizar el contorno. Inhabilite GL_TEXTURE_2D
antes de dibujar sus líneas.
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 glut. Pero como soy nuevo en OpenGL y MFC y comencé con la combinación de MFC, no pudieron ayudarme mucho.
Estoy personalizando la clase COpenGLcontrol aquí en codeguru para mis propios fines. Aquí está la clase personalizada completa, pero si no está interesado en descargarla, no hay problema, le explicaré las partes relacionadas. Esto puede tomar un tiempo, ¡así que espero que sea paciente!
En primer lugar, debo decirles que mi objetivo al dibujar un rectángulo de este tipo es que quiero crear dos instancias de la clase en mi programa.
en la ventana más pequeña, la imagen siempre estará en el modo de zoom extent
, pero en la más grande, el usuario tiene la capacidad de realizar diferentes tareas de navegación. Entonces, cada vez que, por ejemplo, la imagen se panoramiza o amplía en la función OnDraw
de la instancia más grande, the extent rectangle
se calculará y pasará a la ventana más pequeña y se dibujará allí para mostrar que estamos en una imagen tan grande
He seguido estos pasos:
Modificando la pila de 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);
}
Modificar la pila de matriz de vista de modelo y configurar 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ínea setViewRectangle()
es para calcular vector<int>ViewRectangle
uno de los datos de miembro público de la clase y, si el usuario lo desea, el vector<int>RectangleToDraw
otros datos de miembro público se usará para dibujar el rectángulo. Esto se debe a que no queremos en la gran ventana dibujar tal rectángulo, pero en el más pequeño lo hacemos. Y el más pequeño usará 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 en el momento solo para probar la clase, he establecido el valor inicial de RectangleToDraw
siguiente manera y dado que la ventana es un [0,0,573,543]
glOrtho
por glOrtho
, 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 calcular ViewRectangle
que se pasará 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 sobre 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 usar glVertex2f
en la función anterior no hace ninguna diferencia y en ambas circunstancias, encuentro:
No te confundas La razón por la que se aplica el dibujo incorrecto en ambas ventanas es porque he establecido en el constructor:
WantToDrawRectangle = true;
RectangleToDraw.at(0) = -100;
RectangleToDraw.at(1) = -100;
RectangleToDraw.at(2) = 100;
RectangleToDraw.at(3) = 100;
solo 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 sobre una textura preferiblemente de forma orientada a objetos que necesito renderización en tiempo real?