`

Android OpenGL ES 开发教程(26):设置光照效果Set Lighting

 
阅读更多

上一篇简单介绍了OpenGL中使用的光照模型,本篇结合OpenGL ES API说明如何使用光照效果:

  • 设置光源
  • 定义法线
  • 设置物体材料光学属性

光源

OpenGL ES中可以最多同时使用八个光源,分别使用0到7表示。

OpenGL ES光源可以分为

  • 平行光源(Parallel light source), 代表由位于无限远处均匀发光体,太阳可以近似控制平行光源。
  • 点光源(Spot light source) 如灯泡就是一个点光源,发出的光可以指向360度,可以为点光源设置光衰减属性(attenuation)或者让点光源只能射向某个方向(如射灯)。
  • 可以为图形的不同部分设置不同的光源。

下面方法可以打开某个光源,使用光源首先要开光源的总开关:


然后可以再打开某个光源如0号光源:


设置光源方法如下:

  • public void glLightfv(int light,int pname, FloatBuffer params)
  • public void glLightfv(int light,int pname,float[] params,int offset)
  • public void glLightf(int light,int pname,float param)
  • light 指光源的序号,OpenGL ES可以设置从0到7共八个光源。
  • pname: 光源参数名称,可以有如下:GL_SPOT_EXPONENT, GL_SPOT_CUTOFF, GL_CONSTANT_ATTENUATION, GL_LINEAR_ATTENUATION, GL_QUADRATIC_ATTENUATION, GL_AMBIENT, GL_DIFFUSE,GL_SPECULAR, GL_SPOT_DIRECTION, GL_POSITION
  • params 参数的值(数组或是Buffer类型)。

其中为光源设置颜色的参数类型为GL_AMBIENT,GL_DIFFUSE,GL_SPECULAR,可以分别指定R,G,B,A 的值。

指定光源的位置的参数为GL_POSITION,值为(x,y,z,w):

平行光将w 设为0.0,(x,y,z)为平行光的方向:

对于点光源,将 w 设成非0值,通常设为1.0. (x,y,z)为点光源的坐标位置。

将点光源设置成聚光灯,需要同时设置GL_SPOT_DIRECTION,GL_SPOT_CUTOFF等 参数,GL_POSITION的设置和点光源类似:将 w 设成非0值,通常设为1.0. (x,y,z)为点光源的坐标位置。而对于GL_SPOT_DIRECTION 参数,设置聚光的方向(x,y,z)

GL_SPOT_CUTOFF 参数设置聚光等发散角度(0到90度)

GL_SPOT_EXPONENT 给出了聚光灯光源汇聚光的程度,值越大,则聚光区域越小(聚光能力更强)。

对应点光源(包括聚光灯),其它几个参数GL_CONSTANT_ATTENUATION, GL_LINEAR_ATTENUATION, GL_QUADRATIC_ATTENUATION 为点光源设置光线衰减参数,公式有如下形式,一般无需详细了解:

在场景中设置好光源后,下一步要为所绘制的图形设置法线(Normal),只有设置了法线,光源才能在所会物体上出现光照效果。三维平面的法线是垂直于该平面的三维向量。曲面在某点P处的法线为垂直于该点切平面的向量

和设置颜色类似,有两个方法可以为平面设置法线,一是

public void glNormal3f(float nx,float ny,float nz)

这个方法为后续所有平面设置同样的方向,直到重新设置新的法线为止。

为某个顶点设置法线:

public void glNormalPointer(int type,int stride, Buffer pointer)

  • type 为Buffer 的类型,可以为GL_BYTE, GL_SHORT, GL_FIXED,或 GL_FLOAT
  • stride: 每个参数之间的间隔,通常为0.
  • pointer: 法线值。

打开法线数组

用法和Color, Vertex 类似。参见Android OpenGL ES 开发教程(8):基本几何图形定义

规范化法向量,比如使用坐标变换(缩放),如果三个方向缩放比例不同的话,顶点或是平面的法线可能就有变好,此时需要打开规范化法线设置:


经过规范化后法向量为单位向量(长度为1)。同时可以打开缩放法线设置



设置好法线后,需要设置物体表面材料(Material)的反光属性(颜色和材质)。

将在下篇介绍设置物体表面材料(Material)的反光属性(颜色和材质)并给出一个光照的示例。

分享到:
评论

相关推荐

    Android OpenGL ES 简明开发教程

    ### Android OpenGL ES 开发教程详解 #### 概述与历史沿革 OpenGL ES(OpenGL for Embedded Systems)作为OpenGL API的子集,专为移动设备、PDA和游戏主机等嵌入式系统设计,旨在简化3D图形应用的开发流程。自2003...

    Android OpenGL ES 简明开发教程四:3D 坐标变换

    在Android平台进行3D图形开发时,OpenGL ES(Open Graphics Library for Embedded Systems)是一项关键的技术。它允许开发者在移动设备上创建复杂的3D图形和动画。在OpenGL ES的环境中,3D坐标变换是构建和操作3D...

    OpenGL ES应用开发实践指南 Android卷

    由资深Android开发专家根据OpenGLES2.0版本撰写,不仅系统地讲解了OpenGLES的核心概念、技术,以及Android的图形机制,还通过大量案例讲解了在Android上进行OpenGLES开发的方法和技巧。  《OpenGL ES应用开发实践...

    Android OpenGL ES 简明开发教程相关源码真正的3D图形

    Android OpenGL ES 简明开发真正的3D图 ...Android平台提供的OpenGL ES API主要定义在包android.opengl ,javax.microedition.khronos.egl ,javax.microedition.khronos.opengles ,java.nio 等几个包中

    Android OpenGL ES 2.0学习书籍.rar

    最后,了解如何与硬件加速的OpenGLES API交互,以及熟悉GLSL语言(OpenGL Shading Language),是成为OpenGL ES 2.0专家的必经之路。通过编写高效、可读性强的着色器代码,可以创造出各种复杂的视觉效果,实现令人...

    Android开发之OpenGL ES教程

    在Android上设置OpenGL ES视图是开发过程中的第一步,而`GLSurfaceView`是实现这一目标的关键组件。`GLSurfaceView`是Android 1.5引入的一个API类,它为OpenGL ES应用提供了基础框架和生命周期管理。以下是你需要...

    OpenGL ES应用开发实践指南(Android卷).pdf

    由资深Android开发专家根据OpenGLES2.0版本撰写,不仅系统地讲解了OpenGLES的核心概念、技术,以及Android的图形机制,还通过大量案例讲解了在Android上进行OpenGLES开发的方法和技巧。  《OpenGL ES应用开发实践...

    Android OpenGL ES 开发教程(19):绘制迷你太阳系

    ### Android OpenGL ES 开发教程(19):绘制迷你太阳系 #### 一、引言 OpenGL ES(OpenGL for Embedded Systems)是OpenGL的一个版本,专为手持设备等嵌入式系统设计,支持2D和3D图形渲染。本文将详细介绍如何在...

    OpenGL ES 2 for Android A Quick-Start Guide

    《OpenGL ES 2 for Android: A Quick-Start Guide》是一本专为Android开发者设计的实用指南,旨在帮助读者快速掌握OpenGL ES 2的核心概念和技术,并应用于Android应用开发中。本书通过丰富的示例代码和清晰易懂的...

    OpenGLES 2.0 for android 开发教程 从入门到精通和Demo

    在Android系统中,OpenGLES 2.0是用于图形渲染的重要框架,支持3D图形和复杂的视觉效果。本教程旨在帮助开发者从零基础开始掌握OpenGLES 2.0,并通过实例Demo加深理解。 入门篇: 1. **环境配置**:首先,你需要...

    Android 3D游戏开发技术宝典:OpenGL ES 2.0 源代码.7z

    如题,Android 3D游戏开发技术宝典:OpenGL ES 2.0书中的全部源代码。该书由浅入深的讲解了OpenGL ES 2.0在3D游戏开发中的各个方面,还给出了BN赛艇、火力篮球、夜鹰行动三个经典游戏的全部源代码。

    Android OpenGL ES 简明开发教程相关源码材质渲染

    这个“Android OpenGL ES 简明开发教程相关源码材质渲染”旨在教授如何在Android应用中利用OpenGL ES进行材质渲染,从而创建出丰富的视觉效果。 材质渲染是OpenGL ES中的关键概念,它涉及到物体表面的外观属性,如...

    Android OpenGL ES 简明开发教程相关源码添加颜色

    Android OpenGL ES 简明开发教程相关源码添加颜色 简单的上色方法叫做顶点着色(Vertxt coloring),可以使用单色,也可以定义颜色渐变或者使用材质(类同于二维图形中各种Brush类型)。

    Android OpenGL ES MetaBall 2D融球效果

    平台:Android 语言:GLSL(OpenGL ES) 算法:MetaBall 效果:2D融球效果

    OpenGL入门第五步:基础光照代码

    OpenGL入门第五步:基础光照代码

    [Android.3D游戏开发技术宝典:OpenGL.ES.2.0].吴亚峰.扫描版[ED2000.COM].rar

    总而言之,《Android.3D游戏开发技术宝典:OpenGL.ES.2.0》是一本全面而深入的教程,适合对3D游戏开发感兴趣的初学者,以及寻求提升自己Android游戏开发技能的有经验开发者。通过阅读这本书并实践其中的代码示例,...

Global site tag (gtag.js) - Google Analytics