static void display() { glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); //glMatrixMode(GL_PROJECTION); glLoadIdentity(); GLfloat S[16] = { 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 0.5f, 0.0f, 0.5f, 0.5f, 0.5f, 1.0f, }; GLdouble size = 16.0; switch(spotLightChosen) { case SPOTLIGHT1: { GLint spotlight1location = glGetUniformLocation(spotlight1loader->getProgram(), "image"); spotlight1loader->bind(); glUniform1i(spotlight1location, 0); spotlight1loader->bind(); glActiveTexture(GL_TEXTURE0); //std::cout << "Texture 1: " << boxloader->getTexture(0) << std::endl; glBindTexture(GL_TEXTURE_2D, spotlight1loader->getTexture(0)); glMatrixMode(GL_TEXTURE); { glLoadMatrixf(S); glOrtho(-size, +size, -size, +size, -size, +size); glRotated(-light[0], 1.0, 0.0, 0.0); glRotated(-light[1], 0.0, 1.0, 0.0); } } break; case SPOTLIGHT2: break; case NOSPOTLIGHT: // break; default: std::cout << "OnDraw - spotLightChosen: Shouldn't be here" << std::endl; break; } glMatrixMode(GL_MODELVIEW); glLoadIdentity(); lights(); /*Camera */ viewglut_apply(camera); viewglut_render(camera); /*Drawing*/ glTranslatef(0, 0, -10); glPushMatrix(); { if(planeEnabled) { glDisable(GL_LIGHTING); plane_render(p); glEnable(GL_LIGHTING); } } glPopMatrix(); glTranslated(0.0, 1.0, 0.0); switch(modelChosen) { case THIRTEENBOX:{ //glMatrixMode(GL_TEXTURE); //glEnable(GL_TEXTURE_2D); GLint diffuselocation = glGetUniformLocation(boxloader->getProgram(), "diffuse_texture"); GLint normallocation = glGetUniformLocation(boxloader->getProgram(), "normal_texture"); //std::cout << "diffuse location: " << diffuselocation << std::endl; //std::cout << "normal location: " << normallocation << std::endl; boxloader->bind(); glUniform1i(diffuselocation, 0); glUniform1i(normallocation, 1); //glActiveTexture(GL_TEXTURE0 + boxloader->getTexture(0)); glActiveTexture(GL_TEXTURE0); //std::cout << "Texture 1: " << boxloader->getTexture(0) << std::endl; glBindTexture(GL_TEXTURE_2D, boxloader->getTexture(0)); glActiveTexture(GL_TEXTURE1); //std::cout << "Texture 2: " << boxloader->getTexture(1) << std::endl; glBindTexture(GL_TEXTURE_2D, boxloader->getTexture(1)); obj_render(box); boxloader->unbind(); } break; case TROLL: obj_render(troll); break; case NOMODELS: //Nothing gets rendered homeboy break; default: std::cout << "modelChosen Out of Range. Draw Method-modelChosen = " << modelChosen << std::endl; break; } glMatrixMode(GL_MODELVIEW); glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE); glutSwapBuffers(); }
/** * 2. Determinación de superficies ocultas por medio de Z-Buffer y optimización por Backface culling. */ int main(int argc, char* argv[]) { // Crear una ventana de 750x750 pixels. int cw = 750; int ch = 750; cg_init(cw, ch, NULL); // Actualizar la pantalla: glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glMatrixMode(GL_PROJECTION); glViewport(0,0,cw, ch); glFrustum(-1,1,-1,1,1,1000); Obj* obj = obj_load("../Models/knight.obj"); float ang = 0.0f; float pitch = 0.0f; float ang_vel = 1.0f; char done = 0; char wireframe = 0; char bfc = 0; glEnable(GL_DEPTH_TEST); char zbuff = 1; unsigned char key_pressed[1024]; memset(key_pressed, 0, 1024); while (!done) { SDL_Event event; while(SDL_PollEvent(&event)) { switch (event.type) { case SDL_KEYDOWN: key_pressed[event.key.keysym.sym] = 1; if (event.key.keysym.sym == SDLK_z) { zbuff = !zbuff; if(zbuff) glEnable(GL_DEPTH_TEST); else glDisable(GL_DEPTH_TEST); break; } else if (event.key.keysym.sym == SDLK_b) { bfc = !bfc; if(bfc) { glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glFrontFace(GL_CW); } else glDisable(GL_CULL_FACE); break; } else if (event.key.keysym.sym == SDLK_m) { wireframe = !wireframe; if(wireframe) glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); else glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); break; } else if (event.key.keysym.sym != SDLK_ESCAPE) break; case SDL_QUIT : done = 1; break; case SDL_KEYUP: key_pressed[event.key.keysym.sym] = 0; } } glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0f, 0.0f, -50.0f); glRotatef(pitch, 1.0f, 0.0f, 0.0f); glRotatef(ang, 0.0f, 1.0f, 0.0f); glRotatef(-90.0f, 1.0f, 0.0f, 0.0f); if(key_pressed[SDLK_RIGHT]) ang += ang_vel; if(key_pressed[SDLK_LEFT]) ang -= ang_vel; if(key_pressed[SDLK_UP]) pitch += ang_vel; if(key_pressed[SDLK_DOWN]) pitch -= ang_vel; glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); obj_render(obj); cg_repaint(); } // Liberar recursos: obj_free(obj); cg_close(); return 0; }
/** * Dibuje el modelo definido por el archivo knight.obj 1 disponible en webasignatura. El * formato del archivo OBJ se encuentra definido en el anexo I de este documento. Cada * triángulo del modelo debe ser dibujado usando un tono de gris randómico en sus vértices. * Nota: Para parsear el archivo obj, puede utilizar las funciones fgets (definida en stdio.h), * strcmp, strtok (definidas en string.h), atof y atoi (definidas en stdlib.h). */ int main(int argc, char* argv[]) { // Crear una ventana de 500x500 pixels: int cw = 900; int ch = 900; cg_init(cw, ch, NULL); #ifdef WIN32 freopen( "CON", "w", stdout ); freopen( "CON", "w", stderr ); #endif printf("GL Version: %s\n", glGetString(GL_VERSION)); // Actualizar la pantalla: glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glMatrixMode(GL_PROJECTION); glViewport(0,0,cw, ch); glFrustum(-1,1,-1,1,1,1000); //Habilito la iluminación del pipeline estático de OpenGL. glEnable(GL_LIGHTING); //Creo un Vec4 para representar el color (RGBA) y la Intensidad de la luz. //P.e.: (1,1,1,1) = Luz Blanca intensa, (0.5,0.5,0.5,1) = Luz blanca tenue, (0.5,0,0,1) = Luz roja tenue. float l0[] = {1.0f,1.0f,1.0f,1.0f}; //Creo un Vec4 para representar el color (RGBA) y la intensidad de la iluminación ambiente de la luz float la[] = {0.10f,0.10f,0.10f,1.0f}; //Creo un Vec4 para representar la posición de la luz. El cuarto elemento representa el tipo de luz: 1=puntual, 0=direccional float l0p[]= {1.0f,1.0f,1.0f,1.0f}; //Creo un Vec4 para representar el color (RGBA) y la intensidad especular de la luz float ls[] = {1.0f,1.0f,1.0f,1.0f}; //Cargo la intesidad ambiente de la Luz Nro 0 del pipline estático. glLightfv(GL_LIGHT0, GL_AMBIENT, la); //Cargo la intesidad difusa de la Luz Nro 0 del pipline estático. glLightfv(GL_LIGHT0, GL_DIFFUSE, l0); //Cargo la posición de la Luz Nro 0 del pipline estático. glLightfv(GL_LIGHT0, GL_POSITION, l0p); //Cargo la intesidad especular de la Luz Nro 0 del pipline estático. glLightfv(GL_LIGHT0, GL_SPECULAR, ls); //Prendo la Luz nro 0 del pipline estático. Hay 8 luces, representadas por las constantes GL_LIGHT0 a GL_LIGHT7 //Por defecto está todas apagadas al inicio. glEnable(GL_LIGHT0); //Creo un Vec4 para representar el color difuso(RGBA) del material del objeto a dibujar. float cyan[] = {1.0f, 0.0f, 1.0f, 1.f}; //Cargo el color difuso del la cara de adelante del objeto a dibujar. glMaterialfv(GL_FRONT, GL_DIFFUSE, cyan); //Cargo el color especular del la cara de adelante del objeto a dibujar. glMaterialfv(GL_FRONT, GL_SPECULAR, ls); //Cargo el coeficiente especular de la cara de adelante del objeto a dibujar. glMateriali(GL_FRONT, GL_SHININESS, 32); float ang = 0.0f; float pitch = 0.0f; float ang_vel = 1.0f; Obj* obj = obj_load("Models/knight.obj"); printf("num of faces %d\n", obj->numfaces); // delete printf("num of vertices %d\n", obj->numverts); // delete char done = 0; char wireframe = 0; char bfc = 0; glEnable(GL_DEPTH_TEST); char zbuff = 1; unsigned char key_pressed[1024]; memset(key_pressed, 0, 1024); while (!done) { SDL_Event event; while(SDL_PollEvent(&event)) { switch (event.type) { case SDL_KEYDOWN: key_pressed[event.key.keysym.sym] = 1; if (event.key.keysym.sym == SDLK_z) { zbuff = !zbuff; if(zbuff) glEnable(GL_DEPTH_TEST); else glDisable(GL_DEPTH_TEST); break; } else if (event.key.keysym.sym == SDLK_m) { wireframe = !wireframe; if(wireframe) glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); else glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); break; } else if (event.key.keysym.sym == SDLK_b) { bfc = !bfc; if(bfc) { glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glFrontFace(GL_CW); } else glDisable(GL_CULL_FACE); break; } else if (event.key.keysym.sym != SDLK_ESCAPE) break; case SDL_QUIT : done = 1;break; case SDL_KEYUP: key_pressed[event.key.keysym.sym] = 0; } } glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0f, 0.0f, -50.0f); glRotatef(pitch, 1.0f, 0.0f, 0.0f); glRotatef(ang, 0.0f, 1.0f, 0.0f); glRotatef(-90.0f, 1.0f, 0.0f, 0.0f); if(key_pressed[SDLK_RIGHT]) ang += ang_vel; if(key_pressed[SDLK_LEFT]) ang -= ang_vel; if(key_pressed[SDLK_UP]) pitch += ang_vel; if(key_pressed[SDLK_DOWN]) pitch -= ang_vel; glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); obj_render(obj); cg_repaint(); } obj_free(obj); // Liberar recursos: cg_close(); // Ejemplo del modulo de Manejo de Memoria (MM): int* pint = (int *)cg_malloc(10*sizeof(int)); printf("pint is a pointer: %p\n", pint); cg_free(pint); // olvidarse de liberar este objeto produce un mensaje return 0; }
int main(int argc, char *argv[]) { GLFWwindow* window; glfwSetErrorCallback(error_callback); glfwInit(); window = glfwCreateWindow(640, 480, "Simple example", NULL, NULL); glfwMakeContextCurrent(window); glewExperimental = GL_TRUE; glewInit(); //glfwWindowHint(GLFW_SAMPLES, 0); // 0x antialiasing glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // 设置OPENGL版本3.3 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwSwapInterval(1); glfwSetKeyCallback(window, key_callback); glfwSetCursorPosCallback(window, cursorpos_callback); glfwSetMouseButtonCallback(window, mousebutton_callback); glClearColor(0,0,0,1); // 清理屏幕为黑色 glEnable(GL_CULL_FACE); // 启用面剔除 glCullFace(GL_BACK); glEnable(GL_DEPTH_TEST); // 启用深度测试 glEnable(GL_LIGHT0); // 启用灯光0 glEnable(GL_NORMALIZE); // 启用法线 glEnable(GL_COLOR_MATERIAL);// 启用材质模式 glEnable(GL_LIGHTING); // 打开灯光 glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER ,0.9);//0.5可以换成任何在0~1之间的数 glShadeModel(GL_SMOOTH); // 设置灯光的颜色 const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f }; const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f }; const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f }; const GLfloat light_position[] = { 0.0f, 3.0f, -5.0f, 0.0f }; glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); // 设置环境光颜色 glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); // 设置漫反射的颜色 glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); // 设置镜面反射的颜色 //glLightfv(GL_LIGHT0, GL_POSITION, light_position); // 设置灯的位置 // 设置材质的颜色 const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f }; const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f }; const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f }; const GLfloat high_shininess[] = { 100.0f }; glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); // 设置环境光颜色 glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); // 设置漫反射的颜色 glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); // 设置镜面反射的颜色 glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);// 镜面指数 该值越小,表示材质越粗糙,点光源发射的光线照射到上面,也可以产生较大的亮点 obj_data_t* t = obj_create(); obj_read("Data/panel.obj","Data/panel.mtl",t); obj_render_t* rt = obj_create_render(t); obj_render_dump(rt); float rx = -90.0f; float ry = 0.0f; while (!glfwWindowShouldClose(window)) { int width, height; glfwGetFramebufferSize(window, &width, &height); float ratio = (float) width / (float) height; glViewport(0, 0, width, height); // 把图像按照指定宽,高显示到屏幕上 glMatrixMode(GL_PROJECTION); // 选择透视矩阵 glLoadIdentity(); // 重置矩阵 glFrustum(-ratio, ratio, -1.0, 1.0, 2.0, 100.0);// 设置透视矩阵 glMatrixMode(GL_MODELVIEW); // 选择模型矩阵 glLoadIdentity(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清理颜色和深度缓存 //glTranslatef(0.0f ,0.0f, -3.0f); gluLookAt(0.0f,0.0f,-3.0f, 0.0f,0.0f,1.0f, 0.0f,1.0f,0.0); glLightfv(GL_LIGHT0, GL_POSITION, light_position); glRotatef(rx + g_roll_y, 1.0f, 0.0f, 0.0f); glRotatef(ry + g_roll_x, 0.0f, 1.0f, 0.0f); //====================================================================== obj_render(rt); //====================================================================== glfwSwapBuffers(window); glfwPollEvents(); } obj_destory_data(t); obj_destory_render(rt); glfwDestroyWindow(window); glfwTerminate(); return EXIT_SUCCESS; }
/** * http://cse.csusb.edu/tongyu/courses/cs420/notes/lighting.php * Sombreado por medio de la técnica Gouraud Shading. */ int main(int argc, char* argv[]) { // Crear una ventana de 750x750 pixels. int cw = 750; int ch = 750; cg_init(cw, ch, NULL); // Actualizar la pantalla: glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glMatrixMode(GL_PROJECTION); glViewport(0,0,cw, ch); glFrustum(-1,1,-1,1,1,1000); //Habilito la iluminación del pipeline estático de OpenGL. glEnable(GL_LIGHTING); glEnable(GL_DEPTH_TEST); // GL_LIGHT0 Vec4 *vec4La0 = vec4Contructor(0.10f, 0.10f, 0.10f, 1.0f); Vec4 *vec4Ld0 = vec4Contructor(1.0f, 1.0f, 1.0f, 1.0f); Vec4 *vec4Ls0 = vec4Contructor(1.0f, 1.0f, 1.0f, 1.0f); Vec4 *vec4Lp0 = vec4Contructor(1.0f, 1.0f, 1.0f, 0.0f); loadLight(GL_LIGHT0, vec4La0, vec4Ld0, vec4Lp0, vec4Ls0); // GL_LIGHT1 Vec4 *vec4La1 = vec4Contructor(0.5f,0.5f,0.5f,1.0f); Vec4 *vec4Ld1 = vec4Contructor(0.5f, 0.3f, 0.2f, 1.0f); Vec4 *vec4Ls1 = vec4Contructor(1.0f,1.0f,1.0f,1.0f); Vec4 *vec4Lp1 = vec4Contructor(1.0f, 1.0f, 1.0f, 0.0f); loadLight(GL_LIGHT1, vec4La1, vec4Ld1, vec4Lp1, vec4Ls1); // GLfloat spot_direction[] = { -1.0, -1.0, 0.0 }; // glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, 1.5); // glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, 0.5); // glLightf(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, 0.2); // glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 45.0); // glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, spot_direction); // glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, 2.0); // GL_LIGHT2 Vec4 *vec4La2 = vec4Contructor( 0.2f, 0.2f, 0.2f, 1.0f); Vec4 *vec4Ld2 = vec4Contructor(0.8f, 0.8f, 0.8, 1.0f ); Vec4 *vec4Lp2 = vec4Contructor(-1.5f, 1.0f, -4.0f, 1.0f ); Vec4 *vec4Ls2 = vec4Contructor(0.5f, 0.5f, 0.5f, 1.0f ); loadLight(GL_LIGHT2, vec4La2, vec4Ld2, vec4Lp2, vec4Ls2); // TODO, GL_LIGHT3, GL_LIGHT4, GL_LIGHT5, GL_LIGHT6, GL_LIGHT7 Obj* obj = obj_load("../Models/knight.obj"); float ang = 0.0f; float pitch = 0.0f; float ang_vel = 1.0f; char done = 0; char wireframe = 0; char gourandShading = 0; char bfc = 0; char zbuff = 1; char enableLight0 = 0; char enableLight1 = 0; char enableLight2 = 0; char enableLight3 = 0; char enableLight4 = 0; char enableLight5 = 0; char enableLight6 = 0; char enableLight7 = 0; unsigned char key_pressed[1024]; memset(key_pressed, 0, 1024); while (!done) { SDL_Event event; while(SDL_PollEvent(&event)) { switch (event.type) { case SDL_KEYDOWN: key_pressed[event.key.keysym.sym] = 1; if (event.key.keysym.sym == SDLK_z) { zbuff = !zbuff; if(zbuff) glEnable(GL_DEPTH_TEST); else glDisable(GL_DEPTH_TEST); break; } else if (event.key.keysym.sym == SDLK_b) { bfc = !bfc; if(bfc) { glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glFrontFace(GL_CW); } else glDisable(GL_CULL_FACE); break; } else if (event.key.keysym.sym == SDLK_m) { wireframe = !wireframe; if(wireframe) glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); else glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); break; } else if (event.key.keysym.sym == SDLK_g) { gourandShading = !gourandShading; if(gourandShading) glShadeModel(GL_FLAT); else glShadeModel(GL_SMOOTH); break; } else if (event.key.keysym.sym == SDLK_0) { enableLight0 = !enableLight0; if(enableLight0) glEnable(GL_LIGHT0); else glDisable(GL_LIGHT0); break; } else if (event.key.keysym.sym == SDLK_1) { enableLight1 = !enableLight1; if(enableLight1) glEnable(GL_LIGHT1); else glDisable(GL_LIGHT1); break; } else if (event.key.keysym.sym == SDLK_2) { enableLight2 = !enableLight2; if(enableLight2) glEnable(GL_LIGHT2); else glDisable(GL_LIGHT2); break; } else if (event.key.keysym.sym == SDLK_3) { enableLight3 = !enableLight3; if(enableLight3) glEnable(GL_LIGHT3); else glDisable(GL_LIGHT3); break; } else if (event.key.keysym.sym == SDLK_4) { enableLight4 = !enableLight4; if(enableLight4) glEnable(GL_LIGHT4); else glDisable(GL_LIGHT4); break; } else if (event.key.keysym.sym == SDLK_5) { enableLight5 = !enableLight5; if(enableLight5) glEnable(GL_LIGHT5); else glDisable(GL_LIGHT5); break; } else if (event.key.keysym.sym == SDLK_6) { enableLight6 = !enableLight6; if(enableLight6) glEnable(GL_LIGHT6); else glDisable(GL_LIGHT6); break; } else if (event.key.keysym.sym == SDLK_7) { enableLight7 = !enableLight7; if(enableLight7) glEnable(GL_LIGHT7); else glDisable(GL_LIGHT7); break; } else if (event.key.keysym.sym != SDLK_ESCAPE) break; case SDL_QUIT : done = 1; break; case SDL_KEYUP: key_pressed[event.key.keysym.sym] = 0; } } glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0f, 0.0f, -50.0f); glRotatef(pitch, 1.0f, 0.0f, 0.0f); glRotatef(ang, 0.0f, 1.0f, 0.0f); glRotatef(-90.0f, 1.0f, 0.0f, 0.0f); if(key_pressed[SDLK_RIGHT]) ang += ang_vel; if(key_pressed[SDLK_LEFT]) ang -= ang_vel; if(key_pressed[SDLK_UP]) pitch += ang_vel; if(key_pressed[SDLK_DOWN]) pitch -= ang_vel; glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); obj_render(obj); cg_repaint(); } // Liberar recursos: obj_free(obj); cg_close(); return 0; }