浅谈OpenGL中的光照技术

下面的这边文章,让我对OpenGL中的光照有了新的认识

OpenGL场景中模型颜色的产生,大致为如下的流程图所描述:

 浅谈OpenGL中的光照技术_设计制作_电源/新能源

 (1)当不开启光照时,使用顶点颜色来产生整个表面的颜色。

用glShadeModel可以设置表面内部像素颜色产生的方式。GL_FLAT/GL_SMOOTH.

 (2)一般而言,开启光照后,在场景中至少需要有一个光源(GL_LIGHT0.。.GL_LIGHT7)

通过glEnable(GL_LIGHT0) glDisable(GL_LIGHT0) 来开启和关闭指定的光源。

--- 全局环境光 ---

GLfloat gAmbient[] = {0.6, 0,6, 0,6, 1.0};

glLightModelfv(GL_LIGHT_MODEL_AMBIENT, gAmbient);

 (3)设置光源的光分量 -- 环境光/漫色光/镜面光

默认情况下,GL_LIGHT0.。.GL_LIGHT7 的GL_AMBIENT值为(0.0, 0.0, 0.0, 1.0);

GL_LIGHT0的GL_DIFFUSE和GL_SPECULAR值为(1.0, 1.0, 1.0, 1.0),

GL_LIGHT1.。.GL_LIGHT7 的GL_DIFFUSE和GL_SPECULAR值为(0.0, 0.0, 0.0, 0.0)。

GLfloat lightAmbient[] = {1.0, 1.0, 1.0, 1.0};

GLfloat lightDiffuse[] = {1.0, 1.0, 1.0, 1.0};

GLfloat lightSpecular[] = {0.5, 0.5, 0.5, 1.0};

glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient);

glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiffuse);

glLightfv(GL_LIGHT0, GL_SPECULAR, lightSpecular);

 (4)设置光源的位置和方向

-- 平行光 -- 没有位置只有方向

GLfloat lightPosi         TI   on[] = {8.5, 5.0, -2.0, 0.0}; // w=0.0

glLightfv(GL_LIGHT0, GL_POSI  TI ON, lightPosi  TI on);

-- 点光源 -- 有位置没有方向

GLfloat lightPosi  TI on[] = {8.5, 5.0, -2.0, 1.0}; // w不为0

glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);

-- 聚光灯 -- 有位置有方向

 浅谈OpenGL中的光照技术_设计制作_电源/新能源

GLfloat lightPosition[] = {-6.0, 1.0, 3.0, 1.0}; // w不为0

glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);

GLfloat lightDirection[] = {1.0, 1.0, 0.0};

glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, lightDirection); // 聚光灯主轴方向 spot direction

glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 45.0); // cutoff角度 spot cutoff

** 平行光不会随着距离d增加而衰减,但点光源和聚光灯会发生衰减。

at     te   nuation为衰变系数,系数值越大,衰变越快。

默认情况下,c=1.0, l=0.0, q=0.0

 浅谈OpenGL中的光照技术_设计制作_电源/新能源

glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 2.0); // c 系数

glLightf(GL_LIGHT0, GL_     LINEAR   _ATTENUATION, 1.0); // l 系数

glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.5); // q 系数

++

 (5)设置材质属性

环境光、散射光不受视点位置的影响。物体看起来是什么颜色,很大程度上地受到散射光的影响,环境光反射也对物体的颜色有一定的影响。

因为当光直射物体时,散射光最强;非直射时,环境光效果明显。对于真实的世界中的物体,其散射光与环境光通常是同一个颜色。

物体的镜面反射会在物体表面产生一个高亮区。观察者所看到的镜面反射依赖于视点位置 -- 沿着反射光的方向亮度最高。

默认情况下,材质的GL_AMBIENT值为(0.2, 0.2, 0.2, 1.0);GL_DIFFUSE值为(0.8, 0.8, 0.8, 1.0);

GL_SPECULAR值为(0.0, 0.0, 0.0, 1.0);GL_SHININESS值为0.0取值范围为[0.0, 128.0],数值越大,高亮区越小,亮度越高】;

GL_GL_EMISSION值为(0.0, 0.0, 0.0, 1.0)

GLfloat matAmbient[] = {0.6, 0.6, 0.6, 1.0};

GLfloat matDiffuse[] = {0.35, 0.35, 0.35, 1.0};

GLfloat matAmbDif[] = {0.5, 0.5, 0.5, 1.0};

GLfloat matSpecular[] = {0.2, 0.2, 0.2, 1.0};

GLfloat shine[] = {5.0};

GLfloat matEmission[] = {0.3, 0.1, 0.1, 1.0};

glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, matAmbient);

glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, matDiffuse);

glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, matAmbDif); // 将背景颜色和散射颜色设置成同一颜色

glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, matSpecular);

glMaterialfv(GL_FRONT, GL_SHININESS, shine);

glMaterialfv(GL_FRONT, GL_EMISSION, matEmission); // 用来模拟物体发光的效果,但这不是光源

 (6)颜色材质模式

使用颜色材质可以用较小的代价,快速改变场景中模型的颜色。其具体用法如下:

glEnable(GL_COLOR_MATERIAL);

glColorMaterial(GL_FRONT, GL_DIFFUSE);

glColor3f(0.2, 0.5, 0.8);

/*** 绘制一些物体 ***/

glColorMaterial(GL_FRONT, GL_SPECULAR);

glColor3f(0.9, 0.1, 0.3);

/*** 绘制另外一些物体 ***/

glDisable(GL_COLOR_MATERIAL);

1
127
0
82

相关资讯

  1. 1、VIPERHiFi怎么设置音效?VIPERHiFi设置音效的方法2416
  2. 2、Faceu激萌如何设置照片画质?Faceu激萌设置照片画质的方法4917
  3. 3、Xftp6怎么使用?Xftp6文件上传教程分享2526
  4. 4、如何将配音秀的视频置顶将配音秀的视频置顶的教程321
  5. 5、Win10耳机有杂音滋滋声怎么调?3177
  6. 6、坏坏猫搜索怎么缓存小说?坏坏猫搜索缓存小说的方法4564
  7. 7、抖音怎样拍摄我叫安琪拉?抖音拍摄我叫安琪拉的方法步骤3763
  8. 8、如何解决iphone手机系统崩溃的问题iphone手机系统崩溃的解决方法1411
  9. 9、酷狗播放器如何检测电脑网络速度用酷狗播放器检测电脑网络速度的教程2748
  10. 10、QQ音乐如何上传视频QQ音乐上传视频的方法2441
全部评论(0)
我也有话说
0
收藏
点赞
顶部