tutorial texture texturas multiples hacer example ejemplos cubo opengl mfc textures rectangles texture2d

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?