OpenGL(四)光照材质
2016-07-09 21:55
351 查看
通过下面的光照的三菱锥例子学习知识点
<span style="font-size:18px;">#include<windows.h> #include<gl/gl.h> #include<gl/glut.h> #include<gl/glu.h> #include<stdio.h> //学习点 设置环境光 材质光 //一共有四种光照模型,环境光,漫射光,镜面光,辐射光 //材质最终的光源取决于 光照跟材质的光 //旋转角度参数 static GLfloat xRot = 0.0f; static GLfloat yRot = 0.0f; //颜色跟中模式 BOOL bColorMaterial = FALSE; //初始化窗口 void SetupRC(void) { //设置窗口背景西颜色为黑色 glClearColor(0.0f, 0.0f, 0.0f, 1.0f); //指定多变形的阴影模式为平面阴暗模式 glShadeModel(GL_FLAT); } void ChangeSize(int w, int h) { if (h == 0) h = 1; glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w <= h) { glOrtho(-100.0f, 100.0f, -100.0f*h / w, 100.0f*h / w, -100.0f, 100.0f); } else { glOrtho(-100.0f*w / h, 100.0f*w / h, -100.0f, 100.0f, -100.0f, 100.0f); } glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void RenderScene(void) { //清除颜色及深度缓冲区 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); /*设置光照模型*/ //设置光照 glEnable(GL_LIGHTING); //环境光RGBA的值 GLfloat ambient[] = { 0.8f, 0.8f, 0.8f, 1.0f }; // 设置ambient{ 0.2f, 0.2f, 0.2f, 1.0f };调式可以改变环境光看看效果(变暗淡).加深理解 //设置全局环境光 glLightModelfv(GL_LIGHT_MODEL_AMBIENT,ambient); /*设置材质属性*/ //设置材质属性 if (bColorMaterial) { //启动颜色跟踪法 glEnable(GL_COLOR_MATERIAL); //指定多边形的正面使用颜色跟踪法 glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE); } else { //关闭颜色跟踪法 glDisable(GL_COLOR_MATERIAL); GLfloat material_ambient[] = { 0.75f, 0.75f, 0.75f, 1.0f }; //指定多变形的正面的环境反射和漫反射值 glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, material_ambient); } //旋转图形 glPushMatrix(); //角度正负决定是顺逆时针 glRotatef(xRot, 1.0f, 0.0f, 0.0f); //使整个场景绕着x轴旋转 glRotatef(yRot, 0.0, 1.0, 0.0f); //使整个场景绕着y轴旋转 //指定顺时针绕法的多变形为正多变边形正面 glFrontFace(GL_CW); //绘制三菱锥的三个棱面 //他们的颜色分别为红、绿、蓝 glBegin(GL_TRIANGLE_FAN); glVertex3f(0.0, 0.0, 80); glVertex3f(0.0, 50.0, 0.0); glColor3f(1.0, 0.0, 0.0); //红色 glVertex3f(50.0, -50.0, 0.0); glColor3f(0.0f, 1.0f, 0.0); //绿色 glVertex3f(-50.0, -50.0, 0.0); glColor3f(0.0f, 0.0f, 1.0f); //蓝色 glVertex3f(0.0, 50.0, 0.0); glEnd(); //绘制三菱锥的地面,其颜色为黄色 glBegin(GL_TRIANGLE_FAN); glVertex3f(0.0, 50.0, 0.0); glVertex3f(50.0, -50.0, 0.0); glColor3f(1.0, 1.0, 0.0); //黄色 glVertex3f(-50.0, -50.0, 0.0); glEnd(); glPopMatrix(); glutSwapBuffers(); //刷新命令缓冲区 } void SpecialKeys(int key, int x, int y) { if (key == GLUT_KEY_UP) xRot -= 5.0f; if (key == GLUT_KEY_DOWN) xRot += 5.0f; if (key == GLUT_KEY_LEFT) yRot -= 5.0f; if (key == GLUT_KEY_RIGHT) yRot += 5.0f; //结合glPushMatrix()和glPopMatrix()绘图模式理解旋转 // 首先,glPushMateix记住来的绘图坐标(起点) //glRotatef(xRot, 1.0f, 0.0f, 0.0f); //glRotatef(yRot, 0.0f, 1.0f, 0.0f); //然后旋转相应的坐标后绘制图形 //glPopMatrix 回到了坐标原来的位置(起点) printf("%lf\n", yRot); if (xRot >= 360.0f) xRot = 0.0f; if (xRot < -1.0f) xRot = 355.0f; if (yRot >= 360.0f) yRot = 0.0f; if (yRot < -1.0f) yRot = 355.0f; //刷新窗口 强制 glutPostRedisplay(); } void ProcessMenu(int value) { switch (value) { case 1:bColorMaterial = FALSE; break; case 2:bColorMaterial = TRUE; break; default: break; } //强制刷新 glutPostRedisplay(); } int main(int argc, char *argv[]) { //initialize the GLUT library //初始化GLUT库 glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutCreateWindow("加光照的三棱锥"); //回调函数 glutDisplayFunc(RenderScene); glutReshapeFunc(ChangeSize); glutSpecialFunc(SpecialKeys); glutCreateMenu(ProcessMenu); glutAddMenuEntry("普通材质", 1); glutAddMenuEntry("颜色跟踪材质", 2); glutAttachMenu(GLUT_RIGHT_BUTTON); SetupRC(); glutMainLoop(); return 0; } </span>未启动颜色跟踪效果图 启动颜色跟踪效果图
//启动颜色跟踪法
glEnable(GL_COLOR_MATERIAL);
//指定多边形的正面使用颜色跟踪法
glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);
相关文章推荐
- OpenLayers2 源码解析(3)Map
- Linux is not Matrix——感受黑科技吧,网页安装mysql cluster
- nginx lvs keepalived搭建集群
- linux下查看最消耗CPU、内存的进程
- perl 自动登陆网站发短信
- perl 自动登陆网站发短信
- perl 自动登陆网站发短信
- Linux Runtime Memory Measurement
- 3 LNMP
- linux下进行c/c++开发
- Linux内核的namespace机制分析
- cnetos7更改网卡类型
- freopen ()函数
- "围观"设计模式(31)--行为型设计模式总结(模板、观察者、策略、状态、责任链、命令、访问者、中介者、备忘录、解释器)
- apache 日志中记录代理IP以及真实客户端IP
- 华为机试---社交网站好友推荐
- UVA - 12295 Optimal Symmetric Paths
- "围观"设计模式(30)--结构型设计模式总结(适配器、代理、装饰、外观、桥梁、组合、享元)
- Sqoop-1.4.5用户手册
- Sqoop-1.4.5用户手册