//=====================================================================
//TITLE:
//    《OpenGL编程指南》示例笔记(2)--独立地移动光源
//AUTHOR:
//    norains
//DATE:
//    Monday 21-June-2010
//Environment:
//    Windows XP
//=====================================================================

示例概述

例名:独立地移动光源

序号:5-6

页码:P135

源代码:

#include ".//glut//glut.h"#include "windows.h"static int spin = 0;void Init(){ glClearColor(0.0, 0.0, 0.0, 0.0); glShadeModel(GL_SMOOTH); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_DEPTH_TEST);}void Display(){ GLfloat position[] = {0.0, 0.0, 1.5, 1.0}; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glTranslatef(0.0, 0.0, -5.0); glPushMatrix(); glRotated((GLdouble)spin, 1.0, 0.0, 0.0); glLightfv(GL_LIGHT0,GL_POSITION,position); glTranslated(0.0, 0.0, 1.5); glDisable(GL_LIGHTING); glutWireCube(0.1); glEnable(GL_LIGHTING); glPopMatrix(); glutSolidTorus(0.275, 0.85, 8, 15); glPopMatrix(); glFlush();}void Reshape(int w, int h){ glViewport(0,0,(GLsizei)w,(GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(40.0, (GLfloat)w/(GLfloat)h, 1.0, 20.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity();}void Mouse(int button,int status,int x,int y){ switch(button) {  case GLUT_LEFT_BUTTON:  {   if(status == GLUT_DOWN)   {    spin = (spin + 30) % 360;    glutPostRedisplay();   }   break;  }  default:   break; }}int main(int argc,char **argv){ glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(500,500); glutInitWindowPosition(200,200); glutCreateWindow(argv[0]); Init(); glutDisplayFunc(Display); glutMouseFunc(Mouse); glutReshapeFunc(Reshape); glutMainLoop(); return 0;}

程序运行后的图像确实有点丑:

  不知道为啥,源代码特别不喜欢很圆的圆,莫非是作者的机器配置不够?在做实验之前,还是老样子,将圆变得圆滑点。我们将glutSolidTorus的最后一个形参的数值更改为60,即:glutSolidTorus(0.275, 0.85, 8, 60); 
  
  这时候程序跑起来的圆环就圆滑多了:
  
  
  
  
   点击两下鼠标,移动一下光源,看看效果:
  
  
   呵呵,有点像手镯。
  
  
  
  不过,原程序的渐进梯度太广了,只是点击几次就绕了一圈。其实可以更改代码中的spin = (spin + 30) % 360这句。我们将30改成5,那么渐进的梯度就小了。
  
  如图所示:
  
  
   光源移动到了之前原代码没有能到达的区域。
  
  
  
   不过,用鼠标移动光源实在没啥意思,不如让程序自动来移动光源吧!
  
   我们先定义一个Idle函数:
void Idle(){  spin = (spin + 5) % 360;  glutPostRedisplay();  Sleep(20);     }
  
   然后在glutMainLoop之前添加这么一段代码:
   glutIdleFunc(Idle);
  
   那么,我们现在的光源就可以自动移动啦。只不过,我所用的电脑的显卡可能性能不是很好,以代码所执行的速度,有破碎的现象:
  
  
  
  
  其实我们也可以用5.1示例中的圆球,也能测试到不一样的光源效果。我们将代码中的glutSolidTorus(0.275, 0.85, 8, 60)以glutSolidSphere(1.0, 300, 16)替换,则显示效果如下:
  

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

OpenGL编程指南 示例笔记(2)--独立地移动光源相关推荐

  1. 《OpenGL编程指南》 笔记八 程序式纹理

    文章目录 第八章 程序式纹理 8.1 程序式纹理 8.1.1 规则的花纹 条纹 砖块 8.1.2 玩具球 8.1.3 晶格 8.1.4 程序式着色方法的总结 8.2凹凸贴图映射 8.2.1 应用程序设 ...

  2. 《OpenGL编程指南(原书第8版)》——计算着色器

    原文  http://www.csdn.net/article/2014-11-21/2822754 主题 OpenGL 数学 概述 由于图形处理器每秒能够进行数以亿计次的计算,它已成为一种性能十分惊 ...

  3. 《OpenGL编程指南》一3.2 OpenGL缓存数据

    本节书摘来自华章出版社<OpenGL编程指南>一书中的第3章,第3.2节,作者 Bill Licea-Kane ,更多章节内容可以访问云栖社区"华章计算机"公众号查看 ...

  4. OpenGL深入探索——《OpenGL编程指南(原书第8版)》——计算着色器

    转载自 <OpenGL编程指南(原书第8版)>--计算着色器 概述 由于图形处理器每秒能够进行数以亿计次的计算,它已成为一种性能十分惊人的器件.过去,这种处理器主要被设计用于承担实时图形渲 ...

  5. OpenGL编程指南4:双缓冲实现运行

    1.前言 绘制一个旋转的方块,主要为了说明glutSwapBuffers()函数的用法. 同时也为了学习如何使用GLUT控制输入设备,并打开或关闭空闲处理函数. 2.OpenGL编程及程序剖析 /** ...

  6. OpenGL编程指南3:GLUT:OpenGL使用工具库

    1.前言 我们知道的,OpenGL包含了很多的渲染函数,这些函数的设计目的就是独立与任何窗口系统或操作系统.因此,他并没有包含打开窗口或者从键盘或鼠标读取事件的函数.遗憾的是,如果连最基本的打开窗口的 ...

  7. OpenGL编程指南8-Transform Feedback例子理解

    transform feedback 是,OpenGL管线中,的,顶点处理阶段结束之后,图元装配和光栅化之前的一个步骤.transform feedback,可以重新捕获即将装配为图元(点.线段.三角 ...

  8. 《OpenGL编程指南》一第2章 着色器基础

    本节书摘来自华章出版社<OpenGL编程指南>一书中的第2章,作者 Bill Licea-Kane ,更多章节内容可以访问云栖社区"华章计算机"公众号查看 第2章 着色 ...

  9. OpenGL编程指南7:视图-

    1.前言 计算机图形学的要点就是创建三维物体的二维图像(图像必须是二维的,因为他是在平面的屏幕上显示的).但是,当我们决定怎样在屏幕上绘图时,必须使用三维坐标的方式考虑. 为了把一个物体的三维坐标变成 ...

  10. OpenGL编程指南5:学习绘制不同风格的曲线

    1.不同风格曲线绘制 #include <vgl.h> //宏定义;当定义的宏不能用一行表达完整时,可以用"\"表示下一行继续 #define drawOneLine( ...

最新文章

  1. 图论 ---- 思维搜索全图任意位置传送 1520G - To Go Or Not To Go?
  2. 总结C++中取成员函数地址的几种方法
  3. C程序中对时间的处理——time库函数详解转
  4. Mysql事务,并发问题,锁机制-- 幻读、不可重复读--专题
  5. 问题 E: Search Problem (II)
  6. KKT条件 拉格朗日乘子法
  7. 1.2亿次下载,近3万Star的开源项目是为何会“死”掉?
  8. linux系统shell脚本编程,Linux系统shell脚本编程(一)
  9. TracePro v6.02 Win32-ISO 1CD(光学机构仿真软件\
  10. tabbar图标大小更改
  11. 格式工厂kux格式怎么转换成mp4
  12. USB打印服务器作用,沁恒股份USB打印机服务器方案概述
  13. html+css+javascript实现乾坤八卦风水罗盘时钟 (免费附源码)
  14. OBS(Open Broadcaster Software)桌面视频直播软件/直播推流工具使用方法指南
  15. 树莓派外挂ESP32-USB
  16. 分享一个:批量下载个性化桌面壁纸和各种唯美图片的方法
  17. 基于30多万条招聘信息的热门城市、地域 、薪资、人才要求的R语言数据可视化分析
  18. loadrunner--浏览器不支持或禁止了网页脚本,导致您无法正常登录
  19. 从虚拟试衣到设计海报,京东黑科技让时尚行业大变脸
  20. apache2.4开启GZIP压缩

热门文章

  1. c语言编程能力提高,C语言编程能力的培养
  2. 《21天学通Java(第6版)》—— 1.7 问与答
  3. RTI_DDS自定义插件开发 7 资源
  4. 如何在数字化领域脱颖而出?TOGAF®认证为你的职业成长赋能
  5. 计算机组成与设计 笔记(一)
  6. IEC61850——开山篇
  7. 背包九讲(例题+代码)
  8. 查看微信公众号文章发布时间
  9. Python——基础习题(300题)
  10. 防范非法用户入侵系统秘籍