`
wo_deqing
  • 浏览: 64186 次
文章分类
社区版块
存档分类
最新评论

opengl es 灯光

 
阅读更多

这一章将在你的程序中加入灯光,使场景看起来和真实场景一样。

灯光

opengl中灯光分为好几种,都可以加入到你的场景中。

Ambiend Light 环境光
环境光没有确切的来源方向,当环境光照射到物体时,光被反射到各个方向。

Diffuse Light 漫射光
漫射光不同于环境光,它来自某个方向,但和环境光一样,照射到物体时,会被反射到各个方向。

Specular Light 镜面光
镜面光和漫射光一样是有方向的,但它反射方向是一定的,而不像漫射光一样反射到各个方向。所以当镜面光照射到物体时,你会看到物体表面被照射的亮点。

Emissive Light 发射光
它来自于某一物体,该物体散发出大量的光,但不会被任何物体面反射。

为了更好的理解这几种光,我从网络上摘抄了一段定义:
* 环境光——经过多次反射而来的光称为环境光,无法确定其最初的方向,但当特定的光源关闭后,它们将消失.
* 全局环境光——它们并非来自特定的光源,这些光经过了多次散射,已经无法确定其光源位于何处.
* 散射光——来自同一方向,照射到物体表面后,将沿各个方向均匀反射,因此,无论从哪个方向观察,表面的亮度都相同.
* 镜面反射光——来自特定方向,也被反射到特定方向.镜面反射度与之相关.
* 材质发射光——用于模拟发光物体.在OpenGL光照模型中,表面的发射光增加了物体的亮度,它不受光源的影响,另外,发射光不会给整个场景中增加光线.

材质

你不光可以设置光的属性,而且还可以指定不同的面对光照作出的反应,这就要指定材质属性。
这就指定了一个面对光源反射多少。

法线

法线是一个向量垂直于(90度)某一特定面,就称这个向量是某个面的法线。法线可以用于光的计算。如果你想让画出的物体对光源产生影响,那么必须指定物体每个面的法线。下面将会说明。

另一个需要注意的一点是,法线要单位化,我们不会深入数学计算,这不是我们这章的目的。如果需要会在将来某章中讲解。简明的说,一个向量的长度等于各个向量分量的平方和的平方根,再把每个向量的分量除以这个值。现在不需要过多担心这个。

程序代码:

下面定义两个颜色数组,一个用于环境光,一个用于漫射光,它们是光源的颜色值。
float lightAmbient[] = { 0.2f, 0.3f, 0.6f, 1.0f };
float lightDiffuse[] = { 0.2f, 0.3f, 0.6f, 1.0f };

下面创建一个材质属性数组,分别用于环境光和漫射光。
用材质属性值乘以光源值得出面的反射颜色值,下面的值将会导致面反射的光失去接收光的百分之四十。每个值表示特定颜色被反射的数量。
float matAmbient[] = { 0.6f, 0.6f, 0.6f, 1.0f };
float matDiffuse[] = { 0.6f, 0.6f, 0.6f, 1.0f };

void init()
{
首先先启用光源,这样光才会在场景中起作用。
glEnable(GL_LIGHTING);

opengl最多允许8个光源,要使用某个光源,需要使用glEnable打开它,光源的编号是GL_LIGHTX,X的值是0---7。
指定材质属性,可以使用glMaterialfv和glMaterialf ,glMaterialfv接受向量数组,而glMaterialf只接受一个向量。第一个参数指定那个面被更新,在opengl es中只可以使用GL_FRONT_AND_BACK,其他参数不起作用。之所以存在这个参数,是因为opengl可以设置多个参数。
第二个参数指定光源的类型,GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR, GL_EMISSION 和 GL_AMBIENT_AND_DIFFUSE.
最后一个参数指定一个数组或单个值,取决于你使用的哪个函数。

下一行设置面的材质属性:
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, matAmbient);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, matDiffuse);

灯光的设置和材质的设置相同,使用glLightfv或glLightf函数:
glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiffuse);

init函数没有发生改变:
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);

glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepthf(1.0f);

glVertexPointer(3, GL_FLOAT, 0, box);
glEnableClientState(GL_VERTEX_ARRAY);

glEnable(GL_CULL_FACE);
glShadeModel(GL_SMOOTH);
}

display函数的开头部分没有发生改变:
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

gluLookAtf(
0.0f, 0.0f, 3.0f,
0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f);

glRotatef(xrot, 1.0f, 0.0f, 0.0f);
glRotatef(yrot, 0.0f, 1.0f, 0.0f);

前面我们讨论了法线,法线是垂直于面的,所以前平面的法线是(0, 0, 1),后平面的法线是(0, 0, -1),两个法线的长度为1,所以不用再单位化。
法线由glNormal3f 函数指定,并在渲染时调用。这个函数由3个float类型的数据组成单位化的向量。
// FRONT AND BACK
glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
glNormal3f(0.0f, 0.0f, 1.0f);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glNormal3f(0.0f, 0.0f, -1.0f);
glDrawArrays(GL_TRIANGLE_STRIP, 4, 4);

其他页面设置也同上,

// LEFT AND RIGHT
glColor4f(0.0f, 1.0f, 0.0f, 1.0f);
glNormal3f(-1.0f, 0.0f, 0.0f);
glDrawArrays(GL_TRIANGLE_STRIP, 8, 4);
glNormal3f(1.0f, 0.0f, 0.0f);
glDrawArrays(GL_TRIANGLE_STRIP, 12, 4);

// TOP AND BOTTOM
glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
glNormal3f(0.0f, 1.0f, 0.0f);
glDrawArrays(GL_TRIANGLE_STRIP, 16, 4);
glNormal3f(0.0f, -1.0f, 0.0f);
glDrawArrays(GL_TRIANGLE_STRIP, 20, 4);

glFlush();
glutSwapBuffers();
}

最后菜单增加一项彩色材质,这项选择打开或关闭色彩跟踪。色彩跟踪根据当前面的色彩反色不同色的光。

case 2 :
if (glIsEnabled(GL_COLOR_MATERIAL))
glDisable(GL_COLOR_MATERIAL);
else
glEnable(GL_COLOR_MATERIAL);
break;

下面两张图是程序的运行结果,分别是普通灯光和色彩追踪的效果。
普通灯光 色彩跟踪
15-Lighting.gif

15-Lighting01.jpg



现在学会了在场景中添加灯光,它提供了灵活的设置,使得场景更加真实。

分享到:
评论

相关推荐

    OpenGL ES应用开发实践 指南 iOS卷.pdf

    第9章介绍能够提高ios设备上opengl es 2.0渲染性能的优化策略;第10章讲解了地形和拾取;第11章回顾了3d渲染所需的常见数学运算;第12章涵盖了一个结合地形渲染、天空盒、粒子系统、动画、变化视点、灯光、模型和...

    Pro OpenGL ES for Android

    ### Pro OpenGL ES for Android #### 关于本书 《Pro OpenGL ES for Android》是一本专注于介绍如何使用OpenGL ES在Android平台上创建复杂3D图形与游戏应用的专业书籍。OpenGL ES(OpenGL for Embedded Systems)...

    OpenGL ES 应用开发实践

    OpenGL ES(Open Graphics Library for Embedded Systems)是OpenGL三维图形API的一个子集,专为嵌入式系统,如智能手机和平板电脑设计。它提供了一组核心功能,用于渲染2D和3D矢量图形。在iOS平台上,OpenGL ES是...

    android opengl es 飘动的国旗

    9. 增加灯光效果和材质属性 由于之前没有接触过,所以先进行了学习,然后再增加,遇到的问题是写增加灯光效果的时候,由于疏忽,三种光效属性中均写成了对环境光的修改,所以多费了些时间;在对材质属性进行增加的...

    opengles光源固定球体

    在“opengles光源固定球体”这个项目中,开发者通过模仿OpenGL超级宝典中的太阳系统示例,创建了一个包含光源设置、固定光源位置以及球体绘制的程序。 首先,我们来看光源设置。在OpenGL ES中,光源是场景照明的...

    OpenGL 立体五角星 绘制

    此外,还可以通过启用光照模型来增加真实感,通过glEnable(GL_LIGHTING)和glEnable(GL_LIGHT0)开启灯光,然后设置光源的位置和特性。 最后,完成绘制后,使用glFlush()确保所有渲染操作立即完成并显示在屏幕上。...

    OpenGL Game Development

    Mesa 5.0是在2005年左右发布的一个版本,它支持OpenGL 1.4标准,同时包含了一些扩展功能,如OpenGL ES 1.1的支持等。 ### 三、自建窗口应用框架 在本书中,作者提到了自己建立了一个窗口应用框架。这通常指的是...

    sre:SRE 是使用 OpenGL 或 OpenGL-ES 2.0 的优化实时 3D 渲染引擎。 当前版本支持 Linux(OpenGL 或 OpenGL-ES 2.0,在 PC 和某些基于 ARM 的设备上)

    SRE(阴影渲染引擎)是一种优化的实时 3D 渲染引擎,使用 OpenGL 或 OpenGL-ES 2.0 以及多个特定于设备的后端。 它目前在不同的 Linux 平台上运行,但可以移植到其他平台。 截至 2015 年 2 月的当前版本在 PC 平台上...

    安卓幻影灯

    通过OpenGL ES,开发者可以创建复杂的图形动画,包括灯光效果。 2. **Shader语言(GLSL)**: OpenGL ES使用着色器语言(GLSL)来处理图形的着色和光照效果。开发者可能编写顶点着色器和片段着色器,以实现动态变幻...

    WebGl3p:使用 Three.js 和 Node 在 WebGL 中实现的 OpenGl3p

    它是基于OpenGL ES 2.0的一个低级、基于矢量的图形库,允许开发者直接在浏览器内创建交互式的3D图形,无需任何插件。 2. **Three.js**: 作为JavaScript的一个库,Three.js是WebGL的上层封装,简化了WebGL的使用。它...

    HTML5实现的3D空间灯光照射阴影动画效果源码.zip

    WebGL基于OpenGL ES 2.0标准,提供了一种与GPU交互的方式,使得开发者可以创建复杂的3D场景,包括物体、光照、阴影等元素。 在3D空间中,灯光是影响视觉效果的关键因素。这个项目中的“灯光照射”可能涉及了多种...

    Real-Time-3D-Graphics-with-WebGL-2:Packt发行的带有WebGL 2的实时3D图形

    使用JavaScript和WebGL 2(OpenGL ES 3.0)构建交互式3D应用程序 这本书是关于什么的? 随着高度交互的应用程序已成为用户体验中越来越重要的部分,WebGL是一种独特的尖端技术,可将硬件加速的3D图形引入网络。 ...

    Android 4 游戏开发入门(Beginning Android 4 Games Development)

    - **2D与3D游戏开发**:通过实例教授如何基于Canvas API和OpenGL ES开发2D游戏;并介绍如何创建完整的3D游戏。 - **发布与支持**:教授游戏发布流程,包括获取崩溃报告和支持用户的方法。 - **完成可玩游戏**:指导...

    3D基础知识分享PPT

    + 允许把JavaScript和OpenGL ES 2.0结合起来 + 可以在浏览器中实现硬件加速的3D渲染 * OpenGL + 是一种跨编程语言、跨平台的编程接口规格 + 用于三维图像和二维图像 + 是一个功能强大,调用方便的底层图形库 * ...

    gearoenix:跨平台C ++ 3D游戏引擎

    它具有图形API后端(例如OpenGL ES2 , OpenGL ES3 , OpenGL 3.3 , OpenGL 4.3 , Directx11(WIP)和Vulkan(WIP) )的运行时抽象。 它可以自动选择可用的最高后端,此外,您还可以在构建中关闭API后端,这样它就...

    min3d:Android 3D渲染研究项目

    OpenGL ES(OpenGL for Embedded Systems)是 OpenGL 的子集,专为资源有限的设备设计,如智能手机和平板电脑。它提供了一个跨语言、跨平台的编程接口,用于绘制2D和3D图形。OpenGL ES 通常通过硬件加速来提高性能,...

Global site tag (gtag.js) - Google Analytics