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

    

            

透明度计算公式:

雾气计算公式:

 

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

 #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. Spring Mvc 用Demo去学习

    1:首先大体知道 SpringMVC 框架的 运行原理(图片来自网络 ) 2:SpringMVC 是依照DispatcherServlet 展开的 这里可以约Structs2对比,structs2 是 ...

  2. Submin1安装记录(CentOS5)

    安装SVN和Apache wget http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco -O /tmp/RPM-GPG-KEY-WANdisco & ...

  3. centos 修改主机映射

    [root@m1 ~]# vi /etc/hosts

  4. ASP.NET Core:使用EntityFrameworkCore操作MySql来丰富仓储模块

    概述 上一篇简单介绍了Dapper的基本用法,数据的存储为SqlServer.那么这一篇就记录一下使用EFCore来操作MySql的一些方式,这种模式比较适合那种一个项目中需要操作多种数据库的模式.不 ...

  5. linux下部署php项目-Apache、php、mysql关联

    linux下部署php项目环境可以分为两种,一种使用Apache,php,mysql的压缩包安装,一种用yum命令进行安装. 使用三种软件的压缩包进行安装,需要手动配置三者之间的关系.apache和p ...

  6. jsp+servlet实现模糊查询和分页效果

    ---恢复内容开始--- 1.DAO+MVC包 2.DAO接口方法定义 package com.wanczy.dao; import java.math.BigDecimal;import java. ...

  7. JavaScript实现上传图片预览[js前端实现]

    <body> <input type="file" id="file_input" onchange="show_image()&q ...

  8. 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率

    隐马尔科夫模型HMM(一)HMM模型 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率 隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数(TODO) 隐马尔科夫模型HMM(四)维特比算法 ...

  9. java基础(四章)

    一.             switch结构(开关语句)的语法 switch(表达式 ){ ------- [dream1]类型为int.char case  常量1 :    ---------[ ...

  10. 主题模型(概率潜语义分析PLSA、隐含狄利克雷分布LDA)

    一.pLSA模型 1.朴素贝叶斯的分析 (1)可以胜任许多文本分类问题.(2)无法解决语料中一词多义和多词一义的问题--它更像是词法分析,而非语义分析.(3)如果使用词向量作为文档的特征,一词多义和多 ...