这章学了基本光照模型,物体的显示受到以下效果影响:全局环境光,点光源(环境光漫反射分量,点光源漫反射分量,点光源镜面反射分量),材质系数(漫反射系数,镜面反射系数),自身发光,雾气效果等。其中点光源有辐射衰减(距离)和角衰减,根据距离或角度影响光的强度(即颜色)。

    

            

透明度计算公式:

雾气计算公式:

 

下例画出的是浅灰色雾气的环境下,有浅黄色背景光,偏红色的漫反射光和偏灰白的镜面反射光照在茶壶上的效果:

 #include <GLUT/GLUT.h>

 GLsizei winWidth = , winHeight = ;

 void init (void)
{
glEnable(GL_DEPTH_TEST); // 开启深度测试,才会让每个球深度显示正确 // init lighting // 点光源位置
GLfloat light0PosType [] = {0.5, 0.5, 3.0, 1.0};
glLightfv(GL_LIGHT0, GL_POSITION, light0PosType); // 点光源颜色:环境光、漫反射、镜面反射颜色
GLfloat color1 [] = {0.0, 0.0, 0.0, 1.0};
GLfloat color2 [] = {1.0, 0.0, 1.0, 1.0};
glLightfv(GL_LIGHT0, GL_AMBIENT, color1);
glLightfv(GL_LIGHT0, GL_DIFFUSE, color2);
glLightfv(GL_LIGHT0, GL_SPECULAR, color2); // 点光源辐射衰减系数
glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, ); // 之前设置的衰减系数太高,导致点光源没有效果
glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.005);
glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.001); // 点光源角度衰减系数
GLfloat dirVector [] = {0.0, 0.0, 0.0};
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, dirVector);
glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, );
glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 2.7); // 系数越大,衰减的越快,看起来光圆锥体的范围变小 glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
{
// 设置全局环境光颜色,是否固定视点,是否区分镜面反射与非镜面反射,是否前后面都绘制
GLfloat globalAmbient [] = {0.8, 0.8, 0.0, 1.0}; // 偏黄的环境光
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, globalAmbient);
glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);
// glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE); GLfloat ambLight[] = {0.17f, 0.11f, 0.11f}; // 环境光漫反射系数 ka
glMaterialfv(GL_FRONT, GL_AMBIENT, ambLight);
GLfloat difLight[] = {0.61f, 0.24f, 0.24f}; // 光源0漫反射系数 kd
glMaterialfv(GL_FRONT, GL_DIFFUSE, difLight);
GLfloat speLight[] = {0.73f, 0.63f, 0.63f}; // 镜面反射系数 影响高光的亮度ks
glMaterialfv(GL_FRONT, GL_SPECULAR, speLight);
glMaterialf(GL_FRONT, GL_SHININESS, 100.0f); // 镜面反射指数参数 ns 光滑表面ns较大,粗糙表面ns可小到1 // 设置自身发光颜色,看起来很丑。。
// GLfloat surfEmissionColor [] = {0.0, 0.2, 0.0}; // 自身发浅绿光
// glMaterialfv(GL_FRONT, GL_EMISSION, surfEmissionColor);
} glEnable(GL_FOG);//启用雾功能
GLfloat fogColor[] = {0.5f, 0.5f, 0.5f, 1.0f}; glFogi(GL_FOG_MODE, GL_LINEAR);
glFogfv(GL_FOG_COLOR, fogColor);
glFogf(GL_FOG_DENSITY, 0.35f);
glHint(GL_FOG_HINT, GL_DONT_CARE);
glFogf(GL_FOG_START, 1.0f);
glFogf(GL_FOG_END, 10.0f);
glClearColor(fogColor[], fogColor[], fogColor[], fogColor[]);//用雾气背景色
} void drawTeapot (GLfloat x, GLfloat y, GLfloat z)
{
glPushMatrix();
glTranslatef(x, y, z);
glutSolidTeapot(0.8);
glPopMatrix();
} void displayFcn (void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); drawTeapot(, , );
drawTeapot(, , -);
drawTeapot(, , -);
drawTeapot(, , -); glFlush();
} void reshapeFcn (GLint w, GLint h)
{
glViewport(, , (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-, , -, , , ); glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(, , , , , , , , );
} void onMenu (int value)
{
GLint fogMode = ;
switch (value)
{
case :
fogMode = GL_LINEAR;
break;
case :
fogMode = GL_EXP;
break;
case :
fogMode = GL_EXP2;
break;
}
glFogi(GL_FOG_MODE, fogMode);
if (value == )
{
glDisable(GL_FOG);
}
else
{
glEnable(GL_FOG);
}
glutPostRedisplay();
} void CreateMenu(void)
{
glutAddMenuEntry("线性", );
glutAddMenuEntry("指数", );
glutAddMenuEntry("指数2", );
glutAddMenuEntry("无雾", );
glutAttachMenu(GLUT_RIGHT_BUTTON);
} int main(int argc, char * argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowPosition(, );
glutInitWindowSize(winWidth, winHeight);
glutCreateWindow("Lighting");
glutCreateMenu(onMenu);
CreateMenu(); init();
glutDisplayFunc(displayFcn);
glutReshapeFunc(reshapeFcn);
glutMainLoop(); return ;
}

参考文章:http://blog.csdn.net/augusdi/article/details/20494915

[图形学] Chp17 OpenGL光照和表面绘制函数的更多相关文章

  1. 第07课 OpenGL 光照和键盘(1)

    光照和键盘控制: 在这一课里,我们将添加光照和键盘控制,它让程序看起来更美观. 这一课我会教您如何使用三种不同的纹理滤波方式.教您如何使用键盘来移动场景中的对象,还会教您在OpenGL场景中应用简单的 ...

  2. OpenGL光照和颜色

    OpenGL光照和颜色 转自:http://www.cnblogs.com/kekec/archive/2011/08/16/2140789.html OpenGL场景中模型颜色的产生,大致为如下的流 ...

  3. opengl 实体和网格绘图函数(基础)(转)

    http://blog.csdn.net/he_wen_jian/article/details/8594880 GLUT工具箱提供几种图形3维图形的函数: void glutWireSphere(G ...

  4. OpenGL(一)绘制圆、五角星、正弦曲线

    OpenGL入门之"顶点":OpenGL规定,一个多边形必须是一个"凸多边形",即连接多边形上任意两点,其连线都在多边形内部.多边形可以由其边上的端点(这里可称 ...

  5. OpenGL光照3:光源

    本文是个人学习记录,学习建议看教程 https://learnopengl-cn.github.io/ 非常感谢原作者JoeyDeVries和多为中文翻译者提供的优质教程 的内容为插入注释,可以先跳过 ...

  6. 【狼】openGL 光照的学习

    小狼学习原创,欢迎批评指正 http://www.cnblogs.com/zhanlang96/p/3859439.html 先上代码 #include "stdafx.h" #i ...

  7. 浅析OpenGL光照

    浅析OpenGL光照 之前从来都没有涉及光照的内容,心想只要能通过常规的方法渲染出几何体甚至是模型就可以了,然而没有光照的日子注定是苦涩的,因为仅凭几何体和模型的颜色无法达到真是渲染的效果,在实际中有 ...

  8. OpenGL(十七) 绘制折线图、柱状图、饼图

    一.绘制折线图 glutBitmapCharacter(GLUT_BITMAP_8_BY_13,label[j])函数可以绘制GLUT位图字符,第一个参数是GLUT中指定的特定字形集,第二个参数是要写 ...

  9. OpenGL的矩阵使用——绘制桌子

    其中最左边的桌子循环上移(即匀速上移到一定位置后回到原点继续匀速上移),中间的桌子不断旋转(即绕自身中间轴旋转),最右边的桌子循环缩小(即不断缩小到一定大小后回归原来大小继续缩小). 桌子的模型尺寸如 ...

随机推荐

  1. Linux C 程序的开发环境

    1.开发环境的构成 编辑器 vim,vi 编译器 gcc 调试器 gdb 函数库glibc 系统头文件glibc_header 2.gcc编译器 功能强大.性能优越的多平台编译器,gcc可以将c.c+ ...

  2. Lua学习(1)——table

    table类型实现了“关联数组”.“关联数组”是一种具有特殊索引方式的数组.不仅可以通过证书来索引它,还可以使用字符串或其他类型(除了nil)来索引它.table是Lua中主要的数据结构机制(事实也是 ...

  3. R TUTORIAL: VISUALIZING MULTIVARIATE RELATIONSHIPS IN LARGE DATASETS

    In two previous blog posts I discussed some techniques for visualizing relationships involving two o ...

  4. centos6.5 ssh免密码登陆

    ssh-keygen -t rsa ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop1

  5. PHP科普

    1.PHP是什么意思? 超文本预处理器(Hypertext Preprocessor) 2.PHP是干什么用的? PHP是一种通用开源脚本语言.语法吸收了C语言.Java和Perl(实际抽取与汇报语言 ...

  6. JavaScript实现单击全选 ,再次点击取消全选

                 以下为实现思路,已测试,供参考 var allSet = document.getElementById('allSet');//获取全选按钮元素 var a = allSe ...

  7. 两个HTML,CSS布局实例

    今天首先仿照某公司页面只做了一个几乎一模一样,连距离都相同的页面. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional/ ...

  8. Webpack 代码分离

    Webpack 代码分离 代码分离是 webpack 中最引人注目的特性之一. 你可以把你的代码分离到不同的 bundle 中,然后你就可以去按需加载这些文件. 总的来说, webpack 分离可以分 ...

  9. 原生ajax异步请求基础知识

    一.同步交互与异步交互的概念: * 同步交互:客户端向服务器端发送请求,到服务器端进行响应,这个过程中,用户不能做任何其他事情(只能等待响应完才能继续其他请求). * 异步交互:客户端向服务器端发送请 ...

  10. MVC架构简介及其测试策略

    最近在WEB端测试工作中陷入了瓶颈,单纯的手动功能测试在没有成熟的代码规范之前还是很容易坑的,WEB自动化测试一时半会还没有什么进展,所以决定先学习一下网站用的MVC架构,跟着教程写了一个小网站,大概 ...