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




透明度计算公式:

雾气计算公式:

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

#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光照和表面绘制函数的更多相关文章
- 第07课 OpenGL 光照和键盘(1)
光照和键盘控制: 在这一课里,我们将添加光照和键盘控制,它让程序看起来更美观. 这一课我会教您如何使用三种不同的纹理滤波方式.教您如何使用键盘来移动场景中的对象,还会教您在OpenGL场景中应用简单的 ...
- OpenGL光照和颜色
OpenGL光照和颜色 转自:http://www.cnblogs.com/kekec/archive/2011/08/16/2140789.html OpenGL场景中模型颜色的产生,大致为如下的流 ...
- opengl 实体和网格绘图函数(基础)(转)
http://blog.csdn.net/he_wen_jian/article/details/8594880 GLUT工具箱提供几种图形3维图形的函数: void glutWireSphere(G ...
- OpenGL(一)绘制圆、五角星、正弦曲线
OpenGL入门之"顶点":OpenGL规定,一个多边形必须是一个"凸多边形",即连接多边形上任意两点,其连线都在多边形内部.多边形可以由其边上的端点(这里可称 ...
- OpenGL光照3:光源
本文是个人学习记录,学习建议看教程 https://learnopengl-cn.github.io/ 非常感谢原作者JoeyDeVries和多为中文翻译者提供的优质教程 的内容为插入注释,可以先跳过 ...
- 【狼】openGL 光照的学习
小狼学习原创,欢迎批评指正 http://www.cnblogs.com/zhanlang96/p/3859439.html 先上代码 #include "stdafx.h" #i ...
- 浅析OpenGL光照
浅析OpenGL光照 之前从来都没有涉及光照的内容,心想只要能通过常规的方法渲染出几何体甚至是模型就可以了,然而没有光照的日子注定是苦涩的,因为仅凭几何体和模型的颜色无法达到真是渲染的效果,在实际中有 ...
- OpenGL(十七) 绘制折线图、柱状图、饼图
一.绘制折线图 glutBitmapCharacter(GLUT_BITMAP_8_BY_13,label[j])函数可以绘制GLUT位图字符,第一个参数是GLUT中指定的特定字形集,第二个参数是要写 ...
- OpenGL的矩阵使用——绘制桌子
其中最左边的桌子循环上移(即匀速上移到一定位置后回到原点继续匀速上移),中间的桌子不断旋转(即绕自身中间轴旋转),最右边的桌子循环缩小(即不断缩小到一定大小后回归原来大小继续缩小). 桌子的模型尺寸如 ...
随机推荐
- Python下划线的使用
References: [1]. http://python.jobbole.com/81129/ 本文将讨论Python中下划线(_)字符的使用方法.我们将会看到,正如Python中的很多事情,下划 ...
- struts2.1.6教程四_2、ActionContext 、ValueStack 、Stack Context
ActionContext 一次Action调用都会创建一个ActionContext 调用:ActionContext context = ActionContext.getContext() Va ...
- spring 事务无效解决方法
(原) spring 事务目前有二种,注解式和声明式,以前都是以公司里的框架写好的,没有学习的机会,今天抽空好好试了下,结果遇到好多问题. 1.注解式 最开始是这么玩的,发现数据进数据库了,没有起作用 ...
- 写给Android App开发人员看的Android底层知识(7)
(十二)ContentProvider (1)ContentProvider是什么? ContentProvider,简称CP. 做App开发的同学,尤其是电商类App,对CP并不熟悉,对这个概念的最 ...
- python 集合相关操作
集合相关操作 集合是一个无序的,不重复的数据组合,它有着两个主要作用:去重以及关系测试. 去重指的是当把一个列表变成了集合,其中重复的内容就自动的被去掉了 关系测试指的是,测试两组数据之间的交集.差集 ...
- 38. Count and Say - Unsolved
https://leetcode.com/problems/count-and-say/#/description The count-and-say sequence is the sequence ...
- DFS and BFS
DFS https://github.com/Premiumlab/Python-for-Algorithms--Data-Structures--and-Interviews/blob/master ...
- nodejs 开发指南 书中小项目 代码
最近 在学习node.js 先看了下语法 ,然后就看这个开发指南感觉书还是很有用,但是代码太旧了,网上也没有最新的,所以就自己查着前人的痕迹和自己修改,现在可以跑了. https://github.c ...
- 在ie下,a标签包被img的时候,为什么有个蓝色的边线
效果像下图这样 那是由于<img>在ie下有默认边框,只要清除边框就可以了,在style中定义 img{ border:none } 显示效果就变成下面这样了 完!
- MVC4加载zTree树小控件
前言: 第一次学习使用MVC框架,找了个练手项目,加载zTree树小控件.下面我就一步步说明我这次练手的经历以记录.如果有什么错误,希望各位大神帮忙指正,谢谢. 第一步: 利用VS2010新建一个MV ...