1. /*-
  2. * Opengl Demo Test
  3. *
  4. * Fredric : 2016-7-10
  5. */
  6.  
  7. #include <GLUT/GLUT.h>
  8. #include <stdlib.h>
  9.  
  10. void display_demo01();
  11. void display_demo1_idle();
  12.  
  13. int main(int argc, const char * argv[]) {
  14.  
  15. glutInit(&argc, argv);
  16.  
  17. glutCreateWindow("Fredric Practice Demo");
  18.  
  19. glutDisplayFunc(display_demo01);
  20.  
  21. /*
  22. * void APIENTRY glutIdleFunc(void (*func)(void))
  23. * 当没有窗口事件发生时的全局回调函数
  24. */
  25. glutIdleFunc(&display_demo1_idle);
  26.  
  27. glutMainLoop();
  28.  
  29. }
  30.  
  31. //****************************************************************************
  32.  
  33. static int g_angle = ;
  34.  
  35. /*
  36. * 基础动画及光照效果
  37. * 3D图形中的四种光源模型:
  38. * 1、点光源:光源从某一点向四面八方传播,例如太阳
  39. * 2、无穷远光源:对于被照射的物体而言,光线平行摄入,如无穷远处的阳光;
  40. * 3、方向光源:沿某个方向在特定角度内摄入,如手电筒、车灯等;
  41. * 4、环境光源:从各个角度都有投射到场景中的光线
  42. * PS:在opengl中还考虑自身发光的光源
  43. *
  44. * 光线是会随着距离的增加而衰减的,衰减的程度成为衰减因子k,方向光源在偏离该方向时也会衰减
  45.  
  46. * 同时材质需要在光照中考虑反射的情况,分为:
  47. * 1、慢反射:光线射到物体后,其反射是任意方向的;
  48. * 2、镜面反射:光线射到物体后,其反射是根据被照射物体的法线方向;
  49. *
  50. * 综上,对opengl中的某个3D图像顶点的绘制基于如下公式:
  51. * 顶点颜色 = 材质自发光颜色项 + ∑(环境光颜色+衰减因子×(漫反射项 + 镜面反射项))
  52. */
  53. void display_demo01(){
  54.  
  55. glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  56.  
  57. glShadeModel(GL_SMOOTH);
  58.  
  59. glMatrixMode(GL_PROJECTION);
  60.  
  61. glLoadIdentity();
  62.  
  63. gluPerspective(, , , );
  64.  
  65. glMatrixMode(GL_MODELVIEW);
  66.  
  67. glLoadIdentity();
  68.  
  69. gluLookAt(, -, , , , , , , );
  70.  
  71. glColor3f(0.0f, 0.4f, 0.2f);
  72.  
  73. glRotatef(-(g_angle * 10.0f),10.0f,5.0f,0.0f);
  74.  
  75. //设置光源
  76. {
  77. GLfloat light_position[] = {200.0f, 300.0f, 400.0f, 1.0f};
  78. GLfloat light_ambient[] = {1.0f, 1.0f, 1.0f, 1.0f};
  79. GLfloat light_diffuse[] = {1.0f, 1.0f, 1.0f, 1.0f};
  80. GLfloat light_specular[] = {1.0f, 1.0f, 1.0f, 1.0f};
  81.  
  82. /*
  83. * glLightfv (GLenum light, GLenum pname, const GLfloat *params);
  84. * 控制光源的位置、强度、颜色等
  85. * light:GL_LIGHT0 表示第一个光源 GL_LIGHT1 表示第二个光源
  86. * panme: 光源控制的类型
  87. * GL_POSITION:光源位置
  88. * GL_AMBIENT: 光源中的环境光强度
  89. * GL_DIFFUSE: 光源中的散射光强度
  90. * GL_SPECULAR: 光源中的镜面反射光强度
  91. */
  92. glLightfv(GL_LIGHT0, GL_POSITION, light_position);
  93. glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
  94. glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
  95. glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
  96.  
  97. glEnable(GL_LIGHT0);
  98. glEnable(GL_LIGHTING);
  99. glEnable(GL_DEPTH_TEST);
  100. }
  101.  
  102. //设置材质
  103. {
  104. GLfloat mat_ambient[] = {0.0f, 0.5f, 0.3f, 1.0f};
  105. GLfloat mat_diffuse[] = {0.0f, 0.3f, 0.2f, 1.0f};
  106. GLfloat mat_specular[] = {0.0f, 0.8f, 0.2f, 1.0f};
  107. GLfloat mat_emission[] = {0.5f, 0.0f, 0.0f, 1.0f};
  108. GLfloat mat_shininess = 68.0f;
  109.  
  110. /*
  111. * glMaterialfv (GLenum face, GLenum pname, const GLfloat *params)
  112. * 设置材质
  113. * face: 正反面
  114. * GL_FRONT:正面
  115. * GL_BACK:反面
  116. * GL_FRONT_AND_BACK:正反面
  117. * pname:材质属性
  118. * GL_AMBIENT:材质的环境颜色
  119. * GL_DIFFUSE:材质的散射颜色
  120. * GL_SPECULAR:材质的镜面反射颜色
  121. * GL_EMISSION: 材质的发射光颜色
  122. * GL_SHININESS:镜面反射指数,0~128 值越小越粗糙
  123. */
  124.  
  125. glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
  126. glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
  127. glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
  128. glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
  129. glMaterialf (GL_FRONT, GL_SHININESS, mat_shininess);
  130. }
  131.  
  132. //glutSolidSphere(100,30,30);
  133. glutSolidCube();
  134.  
  135. glFlush();
  136.  
  137. glutSwapBuffers();
  138.  
  139. }
  140.  
  141. //回调函数
  142. void display_demo1_idle(){
  143.  
  144. g_angle += ;
  145.  
  146. display_demo01();
  147. }

opengl 笔记(2)的更多相关文章

  1. opengl笔记——旋转,一段代码的理解

    重看:opengl笔记——OpenGL好资料备忘 在找到这段代码,对理解opengl旋转很有帮助 ... glPushMatrix(); // initialze ModelView matrix g ...

  2. OpenGL 笔记 <2> Compiling and Linking a shader program

    Preface 这一节所有的主要内容都在一个OpenGL库文件中<LoadShaders.h> ,只需要用LoadShader()函数进行加载即可.但是由于老是出错,所以自己实现了一下,也 ...

  3. opengl 笔记(1)

    参考<opengl入门教程>.<OpenGL之坐标转换>.<OpenGL绘制管线操作细节>等资料. 复习下留个备忘:) /*- * Opengl Demo Test ...

  4. opengl笔记—— glMultMatrixf() 区别 glLoadMatrixf()

    能找到最好的解释来自:http://www.gamedev.net/topic/489879-glpushmatrixglpopmatrix--glloadmatrixf/ 原理: glPushMat ...

  5. opengl笔记

    GL_ARRAY_BUFFER(表示顶点数据) GL_ELEMENT_ARRAY_BUFFER(表示索引数据) GL_PIXEL_UNPACK_BUFEER( 表示传递给O p e n G L 的像素 ...

  6. OpenGL笔记(五) 着色器渲染(以Android为例)

    一.Android平台上下文环境的创建及初始化 1. 首先实例化Android上下文环境,即EGL的初始化. bool EGLCore::init(EGLContext sharedContext) ...

  7. OpenGL笔记(四) API参考

    常见API glActiveTexture 选择活动纹理单元 glAttachShader 将一个着色器对象绑定到一个程序对象 void glAttachShader(GLuint program, ...

  8. OpenGL笔记(三) GLSL语法与内建函数

    GLSL,OpenGL Shading Language,GLSL中没有指针,并且没有任何类型的字符串或字符. (1)GLSL的修饰符与基本数据类型 const:用于声明非可写的编译时常量变量: at ...

  9. OpenGL笔记(一) 绘制三角形

    GLTools: 一些有用且可复用的函数 GLEW: OpenGL API的一些扩展机制 GLUT: OpenGL Utility toolkit, OpenGL跨平台相关,隐藏平台相关细节 RC代表 ...

随机推荐

  1. 【小程序分享篇 二 】web在线踢人小程序,维持用户只能在一个台电脑持登录状态

    最近离职了, 突然记起来还一个小功能没做, 想想也挺简单,留下代码和思路给同事做个参考. 换工作心里挺忐忑, 对未来也充满了憧憬与担忧.(虽然已是老人, 换了N次工作了,但每次心里都和忐忑). 写写代 ...

  2. 深入浅出Redis-redis底层数据结构(上)

    1.概述 相信使用过Redis 的各位同学都很清楚,Redis 是一个基于键值对(key-value)的分布式存储系统,与Memcached类似,却优于Memcached的一个高性能的key-valu ...

  3. gulp详细入门教程

    本文链接:http://www.ydcss.com/archives/18 gulp详细入门教程 简介: gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:她不仅能对网站资源进行优 ...

  4. 【NLP】Python NLTK处理原始文本

    Python NLTK 处理原始文本 作者:白宁超 2016年11月8日22:45:44 摘要:NLTK是由宾夕法尼亚大学计算机和信息科学使用python语言实现的一种自然语言工具包,其收集的大量公开 ...

  5. 介绍一款原创的四则运算算式生成器:CalculateIt2

    家里小朋友读一年级了,最近每天都有一些10以内的加减法口算练习,作为程序员爸爸,自然也是想办法能够偷懒,让电脑出题,给小朋友做些练习.于是,自己在业余时间开发了一个四则运算算式生成器,名为:Calcu ...

  6. BPM配置故事之案例4-子表

    公司渐渐对采购管理重视起来了,新招聘了采购主管老李,老李对现有的申请表很不满意,要求将申请物资和申请原因改成物资明细表 物资明细表 小明只好继续致电大毛-- 大毛:把申请物资和申请原因删掉,新增一个数 ...

  7. mysql查询性能优化

    mysql查询过程: 客户端发送查询请求. 服务器检查查询缓存,如果命中缓存,则返回结果,否则,继续执行. 服务器进行sql解析,预处理,再由优化器生成执行计划. Mysql调用存储引擎API执行优化 ...

  8. mysql 大表拆分成csv导出

    最近公司有一个几千万行的大表需要按照城市的id字段拆分成不同的csv文件. 写了一个自动化的shell脚本 在/home/hdh 下面 linux-xud0:/home/hdh # lltotal 1 ...

  9. #26 fibonacci seqs

    Difficulty: Easy Topic: Fibonacci seqs Write a function which returns the first X fibonacci numbers. ...

  10. Handler

    1.1 继承AbstractController优点:能定制请求方式 package cn.happyl.controller; import javax.servlet.http.HttpServl ...