博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OpenGL光照和颜色
阅读量:6935 次
发布时间:2019-06-27

本文共 3028 字,大约阅读时间需要 10 分钟。

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 lightPosition[] = {8.5, 5.0, -2.0, 0.0};   // w=0.0glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);

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

GLfloat lightPosition[] = {8.5, 5.0, -2.0, 1.0};   // w不为0glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);

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

      

GLfloat lightPosition[] = {-6.0, 1.0, 3.0, 1.0};   // w不为0glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);GLfloat lightDirection[] = {1.0, 1.0, 0.0};glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, lightDirection);  // 聚光灯主轴方向  spot directionglLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 45.0);   // cutoff角度  spot cutoff

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

       attenuation为衰变系数,系数值越大,衰变越快。

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

               

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);

++

(7)参考

转载地址:http://ffgjl.baihongyu.com/

你可能感兴趣的文章
ListView使用技巧
查看>>
MySQL共享存储主备模式利用Keepalived实现双机高可用
查看>>
作为AI的“辅助大臣”,区块链的前途不可限量
查看>>
学习笔记:vsphere6 迁移物理机,指定被迁移的IP报错
查看>>
都说做ToB商业模式,VR AR博物馆内容的矿或许可以挖下
查看>>
JQuery用户名无刷新验证
查看>>
ubuntu安装和查看已安装
查看>>
[Linux]Shell的运算符和特殊变量
查看>>
c++ ado 程序终止时崩溃
查看>>
关于行号输出的简单命令
查看>>
序列化和反序列化
查看>>
调用天气预报Web Service
查看>>
&#x开头的是什么编码呢。浏览器可以解释它。如中国等同与中文"中国"?
查看>>
Warning: Skipping the data of table mysql.event. Specify the --events option explicitly.
查看>>
新版本来袭:Apache Spark 1.5新特性介绍
查看>>
pthread_create()之前的属性设置
查看>>
spring-cloud:熔断监控Hystrix Dashboard和Turbine的示例
查看>>
Linux学习之CentOS(十二)--crontab命令的使用方法
查看>>
Linux几个命令
查看>>
Linux系统日志级别
查看>>