relacion - Estiramiento de relación de aspecto en OpenGL
relacion de aspecto 1920x1080 (2)
Después de cambiar el tamaño de la ventana, debe ajustar su matriz de proyección para reflejar la nueva relación de aspecto. Si está utilizando OpenGL clásico, cambie el modo de matriz a GL_PROJECTION, cargue la matriz de identidad, luego llame a glOrtho o gluPerspective con la dimensión vertical escalada por la relación de aspecto (suponiendo que desea que la dispersión horizontal de la imagen sea la misma que estaba con la ventana original).
Estoy teniendo problemas con el modo de pantalla completa. Puedo configurar mi ventana para que sea de 800x600, pero cuando realizo una pantalla completa de esa resolución, se estira. Supongo que esto se debe a un cambio en la relación de aspecto. ¿Cómo puedo arreglar esto?
Editar # 1
Aquí hay una captura de pantalla de lo que veo que está sucediendo.
Izquierda: 800x600
Derecha: 1366x768
Editar # 2
Se llama a mi función initGraphics cada vez que cambio el tamaño de la ventana (WM_SIZE).
void initGraphics(int width, int height) {
float aspect = (float)width / (float)height;
glViewport(0, 0, width, height);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND); //Enable alpha blending
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glClearColor(0.0, 0.0, 0.0, 1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, width, height * aspect, 0.0);
glMatrixMode(GL_MODELVIEW);
}
SOLUCIÓN: El verdadero problema fue que estaba haciendo un uso indebido de la función gluO2202D. En lugar de usar esto:
gluOrtho2D(0.0, width, height * aspect, 0.0);
Necesitaba cambiarlo a la forma correcta esto:
gluOrtho2D(0.0, width, 0.0, height);
Este último crea una proyección ortográfica 2D, que llena todo el ancho y la altura de su ventana gráfica, por lo que no se produce ningún estiramiento.
RESPUESTA ORIGINAL:
Debe modificar su proyección para tener en cuenta la nueva relación de aspecto.
Primero asegúrese de configurar glViewport
para el nuevo tamaño de ventana. Una vez configurada la ventana glMatrixMode
deberá cambiar su modo de matriz a proyección con una llamada a glMatrixMode
y, finalmente, calcular su nueva relación de aspecto con width / height
y pasar la nueva relación de aspecto a gluPerspective
. También puede usar glFrustum
recto en lugar de gluPerspective
puede encontrar la fuente de gluPerspective
para lograr el mismo efecto con glFrustum
.
Algo como esto:
float aspectRatio = width / height;
glMatrixMode(GL_PROJECTION_MATRIX);
glLoadIdentity();
gluPerspective(fov, aspectRatio, near, far);