[图形学] 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的矩阵使用——绘制桌子
其中最左边的桌子循环上移(即匀速上移到一定位置后回到原点继续匀速上移),中间的桌子不断旋转(即绕自身中间轴旋转),最右边的桌子循环缩小(即不断缩小到一定大小后回归原来大小继续缩小). 桌子的模型尺寸如 ...
随机推荐
- 《安卓网络编程》之第三篇 使用Apache接口
在Android系统中,提供了一下三种通信接口: 标准的Java 接口:java.net Apache接口:org.apache.http Android网络接口:android.net.http 在 ...
- 前端架构之路:使用Vue.js开始第一个项目
Vue.js做为目前前端最热门的库之一,为快速构建并开发前端项目多了一种思维模式.本文通过一个简单的实例开始上手Vue.js开发. 一.技术准备 笔者建议在开始项目前,对以下两个技术点进行了解. ...
- css样式自动换行/强制换行
写样式时遇到的英文字符超出容器问题,度娘后了解下列知识,与大家分享,同时以便自己日后回顾. 一.自动换行问题 正常字符的换行是比较合理的,而连续的数字和英文字符常常将容器撑大. 下面介绍的是CSS如何 ...
- Libevent源码分析—event, event_base
event和event_base是libevent的两个核心结构体,分别是反应堆模式中的Event和Reactor.源码分别位于event.h和event-internal.h中 1.event: s ...
- Ajax请求汇总(一)
刚开始结束Ajax请求的时候,那真的是迷迷糊糊,昏天暗地,通过学习的深入和翻阅各种资料.求助度娘,总结一下Ajax请求,与大家分享一下,希望能给学习Ajax的同学一些帮助,废话不多手,直接开始~~~ ...
- 织梦dedecms列表页dede:pagelist分页问题
pagelist是dede定义的一个分页标签.有时直接引用这个标签的时候,会出现分页标签变形问题.我在使用非默认模板的时候就遇到过两次. pagelist本身就有一些样式是在include/arc.l ...
- 获取Skype用户IP地址
#!/usr/bin/env bash ESC_SEQ="\x1b[" COL_RESET=$ESC_SEQ"39;49;00m" COL_RED=$ESC_S ...
- Spring学习(2)---IOC
1.接口及面向接口编程 2.什么是IOC 3.Spring的Bean配置 4.Bean的初始化 5.Spring的常用注入方式 (一)接口 用于沟通的中介物的抽象化 实体把自己提供给我外接的一种抽象化 ...
- cookie的路径问题
今天公司网站(不考虑跨域访问情况)有个需求就是在一个路径下存一个cookie 比如这样 www.fdf.com/vichain/dashback/myback 在这个目录下存放一个cookie 在这 ...
- 宿主机共享文件夹给不同Linux虚拟机的方法
一.Windows/Linux宿主机共享文件夹给VMWare中的Linux虚拟机 1.能安装vmware tools1)在vmware的ubuntu中安装vmware tools2)在vmware中开 ...