OpenGL编程指南 示例笔记(2)--独立地移动光源
//=====================================================================
//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)--独立地移动光源相关推荐
- 《OpenGL编程指南》 笔记八 程序式纹理
文章目录 第八章 程序式纹理 8.1 程序式纹理 8.1.1 规则的花纹 条纹 砖块 8.1.2 玩具球 8.1.3 晶格 8.1.4 程序式着色方法的总结 8.2凹凸贴图映射 8.2.1 应用程序设 ...
- 《OpenGL编程指南(原书第8版)》——计算着色器
原文 http://www.csdn.net/article/2014-11-21/2822754 主题 OpenGL 数学 概述 由于图形处理器每秒能够进行数以亿计次的计算,它已成为一种性能十分惊 ...
- 《OpenGL编程指南》一3.2 OpenGL缓存数据
本节书摘来自华章出版社<OpenGL编程指南>一书中的第3章,第3.2节,作者 Bill Licea-Kane ,更多章节内容可以访问云栖社区"华章计算机"公众号查看 ...
- OpenGL深入探索——《OpenGL编程指南(原书第8版)》——计算着色器
转载自 <OpenGL编程指南(原书第8版)>--计算着色器 概述 由于图形处理器每秒能够进行数以亿计次的计算,它已成为一种性能十分惊人的器件.过去,这种处理器主要被设计用于承担实时图形渲 ...
- OpenGL编程指南4:双缓冲实现运行
1.前言 绘制一个旋转的方块,主要为了说明glutSwapBuffers()函数的用法. 同时也为了学习如何使用GLUT控制输入设备,并打开或关闭空闲处理函数. 2.OpenGL编程及程序剖析 /** ...
- OpenGL编程指南3:GLUT:OpenGL使用工具库
1.前言 我们知道的,OpenGL包含了很多的渲染函数,这些函数的设计目的就是独立与任何窗口系统或操作系统.因此,他并没有包含打开窗口或者从键盘或鼠标读取事件的函数.遗憾的是,如果连最基本的打开窗口的 ...
- OpenGL编程指南8-Transform Feedback例子理解
transform feedback 是,OpenGL管线中,的,顶点处理阶段结束之后,图元装配和光栅化之前的一个步骤.transform feedback,可以重新捕获即将装配为图元(点.线段.三角 ...
- 《OpenGL编程指南》一第2章 着色器基础
本节书摘来自华章出版社<OpenGL编程指南>一书中的第2章,作者 Bill Licea-Kane ,更多章节内容可以访问云栖社区"华章计算机"公众号查看 第2章 着色 ...
- OpenGL编程指南7:视图-
1.前言 计算机图形学的要点就是创建三维物体的二维图像(图像必须是二维的,因为他是在平面的屏幕上显示的).但是,当我们决定怎样在屏幕上绘图时,必须使用三维坐标的方式考虑. 为了把一个物体的三维坐标变成 ...
- OpenGL编程指南5:学习绘制不同风格的曲线
1.不同风格曲线绘制 #include <vgl.h> //宏定义;当定义的宏不能用一行表达完整时,可以用"\"表示下一行继续 #define drawOneLine( ...
最新文章
- 图论 ---- 思维搜索全图任意位置传送 1520G - To Go Or Not To Go?
- 总结C++中取成员函数地址的几种方法
- C程序中对时间的处理——time库函数详解转
- Mysql事务,并发问题,锁机制-- 幻读、不可重复读--专题
- 问题 E: Search Problem (II)
- KKT条件 拉格朗日乘子法
- 1.2亿次下载,近3万Star的开源项目是为何会“死”掉?
- linux系统shell脚本编程,Linux系统shell脚本编程(一)
- TracePro v6.02 Win32-ISO 1CD(光学机构仿真软件\
- tabbar图标大小更改
- 格式工厂kux格式怎么转换成mp4
- USB打印服务器作用,沁恒股份USB打印机服务器方案概述
- html+css+javascript实现乾坤八卦风水罗盘时钟 (免费附源码)
- OBS(Open Broadcaster Software)桌面视频直播软件/直播推流工具使用方法指南
- 树莓派外挂ESP32-USB
- 分享一个:批量下载个性化桌面壁纸和各种唯美图片的方法
- 基于30多万条招聘信息的热门城市、地域 、薪资、人才要求的R语言数据可视化分析
- loadrunner--浏览器不支持或禁止了网页脚本,导致您无法正常登录
- 从虚拟试衣到设计海报,京东黑科技让时尚行业大变脸
- apache2.4开启GZIP压缩