Tenemos la mejor solución que descubrimos on line. Nuestro deseo es que te sirva de ayuda y si quieres aportar algo que nos pueda ayudar a crecer hazlo con total libertad.
Solución:
- Nunca establece una matriz de proyección (significativa).
- No abuse de la pila de matriz de proyección.
- No establezca sus matrices en
drawCube()
principio de responsabilidad única y todo eso. - Establezca su ventana gráfica antes de tratando de dibujar
- C++ tiene
c
-versiones prefijadas (stdio.h
->cstdio
) de los encabezados C. Usa esos en su lugar.
Todos juntos:
#include
#include
#include
void controls(GLFWwindow* window, int key, int scancode, int action, int mods)
if(action == GLFW_PRESS)
if(key == GLFW_KEY_ESCAPE)
glfwSetWindowShouldClose(window, GL_TRUE);
GLFWwindow* initWindow(const int resX, const int resY)
if(!glfwInit())
fprintf(stderr, "Failed to initialize GLFWn");
return NULL;
glfwWindowHint(GLFW_SAMPLES, 4); // 4x antialiasing
// Open a window and create its OpenGL context
GLFWwindow* window = glfwCreateWindow(resX, resY, "TEST", NULL, NULL);
if(window == NULL)
fprintf(stderr, "Failed to open GLFW window.n");
glfwTerminate();
return NULL;
glfwMakeContextCurrent(window);
glfwSetKeyCallback(window, controls);
// Get info of GPU and supported OpenGL version
printf("Renderer: %sn", glGetString(GL_RENDERER));
printf("OpenGL version supported %sn", glGetString(GL_VERSION));
glEnable(GL_DEPTH_TEST); // Depth Testing
glDepthFunc(GL_LEQUAL);
glDisable(GL_CULL_FACE);
glCullFace(GL_BACK);
return window;
void drawCube()
GLfloat vertices[] =
-1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1,
1, -1, -1, 1, -1, 1, 1, 1, 1, 1, 1, -1,
-1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1, -1,
-1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1,
-1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, -1,
-1, -1, 1, -1, 1, 1, 1, 1, 1, 1, -1, 1
;
GLfloat colors[] =
0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0,
1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0,
0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0,
0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0,
0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0,
0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1
;
static float alpha = 0;
//attempt to rotate cube
glRotatef(alpha, 0, 1, 0);
/* We have a color array and a vertex array */
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glColorPointer(3, GL_FLOAT, 0, colors);
/* Send data : 24 vertices */
glDrawArrays(GL_QUADS, 0, 24);
/* Cleanup states */
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
alpha += 1;
void display( GLFWwindow* window )
while(!glfwWindowShouldClose(window))
// Scale to window size
GLint windowWidth, windowHeight;
glfwGetWindowSize(window, &windowWidth, &windowHeight);
glViewport(0, 0, windowWidth, windowHeight);
// Draw stuff
glClearColor(0.0, 0.8, 0.3, 1.0);
glClear(GL_COLOR_BUFFER_BIT
int main(int argc, char** argv)
GLFWwindow* window = initWindow(1024, 620);
if( NULL != window )
display( window );
glfwDestroyWindow(window);
glfwTerminate();
return 0;
Creo que su problema es que básicamente está usando proyección ortográfica, o ciertamente algo que no es perspectiva, que es lo que le dará al cubo más apariencia “3D” que creo que está buscando.
Intente algo como lo siguiente para establecer una matriz de proyección de perspectiva correcta:
glMatrixMode(GL_PROJECTION_MATRIX);
glLoadIdentity();
gluPerspective(45, windowWidth / windowHeight, 0.1f, 100.0f);
// Draw calls.
valoraciones y reseñas
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)