您的位置 首页 发布

浅谈OpenGL中的光照技能

浅谈OpenGL中的光照技术-当不开启光照时,使用顶点颜色来产生整个表面的颜色。用glShadeModel可以设置表面内部像素颜色产生的方式。GL_FLAT/GL_SMOOTH.

下面的这边文章,让我对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 lightPosiTIon[] = {8.5, 5.0, -2.0, 0.0}; // w=0.0

glLightfv(GL_LIGHT0, GL_POSITION, lightPosiTIon);

— 点光源 — 有方位没有方向

GLfloat lightPosiTIon[] = {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添加而衰减,但点光源和聚光灯展发生衰减。

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

默许情况下,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);

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/fabu/102685.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部