1.场景中添加光照的步骤

1.定义每个物体的每个顶点的法线向量。这个法向量决定了物体相对于光源的方向。
2.创建和选择一个或多个光照,并设置他们的位置。
3.创建和选择一种光照模型,它定义了全局环境光的层析以及观察点的有效位置(便于进行光照计算)。
4.定义场景中物体的材料属性。

2.光照球体及分析

#include <vgl.h>void init(void)
{//光照参数初始化全位于此处GLfloat mat_specular   [] = {1.0,1.0,1.0,1.0};GLfloat mat_shininess  [] = {100.0};GLfloat light_position [] = {5.0,5.0,5.0,1.0};  //点光源//GLfloat light_position [] = {0.0,0.0,50.0,0.0};  //无限远模拟平行光GLfloat white_light    [] = {1.0,1.0,1.0,1.0};GLfloat model_ambient  [] = {0.1,0.1,0.1,1.0};glClearColor(0.0,0.0,0.0,0.0);glShadeModel(GL_SMOOTH);//为场景中的物体定义材料属性:如何反射光线(材料环境、散射、镜面颜色、光泽度)glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);     //使用镜面材质颜色glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);   //使用光泽度glLightfv(GL_LIGHT0,GL_POSITION,light_position);        //定义光源的位置glLightfv(GL_LIGHT0,GL_DIFFUSE,white_light);            //定义散射光为白色glLightfv(GL_LIGHT0,GL_SPECULAR,white_light);           //定义镜面光为白色glLightModelfv(GL_LIGHT_MODEL_AMBIENT,model_ambient);   //光照模型参数:全局环境光glEnable(GL_LIGHTING); //驱动光源glEnable(GL_LIGHT0);   //启动特定光源glEnable(GL_DEPTH_TEST);
}
void display(void)
{glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glutSolidSphere(1.0,300,16);   //定义球体法向量glFlush();
}
void reshape(int w, int h)
{glViewport(0,0,(GLsizei)w,(GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if( w<h )glOrtho(-1.5,1.5,-1.5*(GLfloat)h/(GLfloat)w,1.5*(GLfloat)h/(GLfloat)w,-10.0,10.0);elseglOrtho(-1.5,1.5,-1.5*(GLfloat)w/(GLfloat)h,1.5*(GLfloat)w/(GLfloat)h,-10.0,10.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();
}
int main(int argc, char** argv)
{glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);glutInitWindowPosition(200,200);glutInitWindowSize(400,400);glutCreateWindow(argv[0]);init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutMainLoop();return 0;
}

输出结果:

3.注意事项

1.定义球体的法向量是在函数gluSolideSphere()中完成的。为了进行正确的光照运算,表面法相必须为单位法向量
2.光照模型中不仅仅定义了全局环境光,还定义了场景中观察者应该位于无限远处还是位于场景本地;也会确定场景中物体的正面和背面是否应该执行不同的光照运算。上例中采用了默认设置,即观察者位于无限远处,并且只有一面接受光照。

OpenGL编程指南12:光照_渲染真实球体相关推荐

  1. OpenGL编程指南(第八版)第一个渲染三角形案例代码在win8双显卡电脑VS2015中运行方法总结

    弄了好几天才把第一个程序运行出来,用该博客记录一下参考的博客资料及问题: 写得很好的博客参考资料为: http://blog.csdn.net/IceTeaSet/article/details/50 ...

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

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

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

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

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

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

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

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

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

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

  7. 《OpenGL编程指南》一第3章 OpenGL绘制方式

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

  8. OpenGl编程指南例2.4大白话分析

    OpenGl编程指南例2.4分析 即上一篇文章搭建了opengl的环境后,继续学习Opengl,被第二章的各种gen,bind,buffer搞得晕头转向,在还没有消化完全的时候,又被一计重击打到--为 ...

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

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

最新文章

  1. PLL_BASE——Basic Phase Locked Loop Clock Circuit(Virtex-5, Spartan-6)
  2. eclipse远程连接Hadoop,用户认证失败
  3. java native堆_Java Native Memory比堆更快吗?
  4. android 获取app自启动权限状态_央视批手机App权限问题:频繁自启动 搜集个人隐私触目惊心...
  5. thymeleaf教程
  6. 每个人都应该了解的HTTPS知识
  7. root权限执行java_执行具有root权限的java代码(一)
  8. C/C++程序员面试宝典-2
  9. 照片被误删?别着急,EasyRecovery帮你找回来
  10. SSH连接工具-Tabby
  11. 优秀的云计算工程师需要学什么?云计算Docker学习路线
  12. 高效能人士的七个习惯——由内而外全面造就自己
  13. 模拟将本地文件上传至外服务器
  14. Proteus仿真——常用元件
  15. vue element table expand 扩展行点击行展示且保证只展示一行
  16. 品达通用权限系统(Day 1~Day 2)
  17. 如何在jsp里面写java代码
  18. 联通云服务器优势,多线云服务器有哪些优势?
  19. Coursera | Grammer and Punctuation(UCI) | Quiz
  20. 选择OA协同办公系统,这4点一定要注意!

热门文章

  1. ambari删除脚本
  2. WPF的ProgressBar进度条
  3. $sanitize和$sce服务的使用方法
  4. 清除WIN2000中的Administrator账号密码
  5. poj 1324(BFS+状态压缩)
  6. 返回结果集的存储过程实例及调用
  7. matPlotLib绘制决策树
  8. Bzoj4568: [Scoi2016]幸运数字
  9. 华为交换机配置Telnet
  10. 如何选择SSL 证书服务