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

    

            

透明度计算公式:

雾气计算公式:

 

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

 #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. Jmeter3.0新特性

    2016-5-19昨日,Jmeter又更新了新版本. 那么新版本有哪些新特性呢? Changes   This page details the changes made in the current ...

  2. 关于微信分享JSSDK使用需注意的几点问题

    微信公众平台技术文档中有微信JS-SDK说明文档,详情见地址https://mp.weixin.qq.com/wiki 官方给出了使用步骤和DEMO,下面说一下几点需要注意的问题. 1.登录微信公众平 ...

  3. Linux_破解密码-营救模式

    实验用机:CentOS 5.7 破解密码 设置开机启动界面 系统运行级别 营救模式 一.破解密码 root用户可以更改任何用户的密码,普通用户只能修改自己的密码. 步骤: 1.重新启动系统 2.开机倒 ...

  4. VR大时代-全景智慧城市搭建是一个任重而道远的任务

    全景智慧城市搭建是一个任重而道远的任务,但是也促进了实体市场的蓬勃发展与进步.VR技术改变了人们以往的娱乐方式,而全景智慧城市将会彻底改变人们的生活习惯.VR是未来的计算平台,更是人力发展历史中,技术 ...

  5. cookie创建,删除

    Cookie 历来指就着牛奶一起吃的点心.然而,在因特网内,“Cookie”这个字有了完全不同的意思.那么“Cookie”到底是什么呢?“Cookie”是小量信息,由网络服务器发送出来以存储在网络浏览 ...

  6. 《物联网框架ServerSuperIO教程》-19.设备驱动和OPC Client支持mysql、oracle、sqlite、sqlserver的持久化。v3.6.4版本发布

    19.设备驱动和OPC Client支持mysql.oracle.sqlite.sqlserver的持久化 19.1     概述 ServerSuperIO支持设备驱动和OPC Client采集的数 ...

  7. Java经典编程题50道之三十六

    有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数. public class Example36 {    public static void main(String[] a ...

  8. (转)微信禁用右上角的分享按钮,WeixinJSBridge API以及隐藏分享的子按钮等菜单项

    <!--禁用微信分享按钮--> <script> function onBridgeReady() { WeixinJSBridge.call('hideOptionMenu' ...

  9. 夜神模拟器与HBuilder连接/cmd运行提示符/执行夜神模拟器命令/执行HBuilder命令

    第一步:启动HBuilder和夜神模拟器 第二步:通过运行电脑命令CMD进入(电脑运行命令的快捷键是:windows键+R2.Ctrl键与Alt键之间的那个键就是windows键或者点击左下角开始图标 ...

  10. eclipse汉化教程,新手神器

    网盘下载地址:http://pan.baidu.com/s/1i5ed6ZF 下载汉化包 将汉化包里的两个文件存放到eclipse安装目录中的dropins文件夹中 重启eclipse 汉化成功