`
lyunabc
  • 浏览: 526151 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

Android OpenGL ES 开发教程(27):材质及光照示例

 
阅读更多

设置物体表面材料(Material)的反光属性(颜色和材质)的方法如下:

public void glMaterialf(int face,int pname,float param)
public void glMaterialfv(int face,int pname,float[] params,int offset)
public void glMaterialfv(int face,int pname,FloatBuffer params)

  • face : 在OpenGL ES中只能使用GL_FRONT_AND_BACK,表示修改物体的前面和后面的材质光线属性。
  • pname: 参数类型,可以有GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR, GL_EMISSION, GL_SHININESS。这些参数用在光照方程。
  • param: 参数的值。

其中GL_AMBIENT,GL_DIFFUSE,GL_SPECULAR ,GL_EMISSION为颜色RGBA值,GL_SHININESS 值可以从0到128,值越大,光的散射越小:

此外,方法glLightModleXX给出了光照模型的参数

public void glLightModelf(int pname,float param)
public void glLightModelfv(int pname,float[] params,int offset)
public void glLightModelfv(int pname,FloatBuffer params)

  • pname: 参数类型,可以为GL_LIGHT_MODEL_AMBIENT和GL_LIGHT_MODEL_TWO_SIDE
  • params: 参数的值。

最终顶点的颜色由这些参数(光源,材质光学属性,光照模型)综合决定(光照方程计算出)。

下面例子在场景中设置一个白色光源:

public void initScene(GL10 gl){
 float[] amb = { 1.0f, 1.0f, 1.0f, 1.0f, };
 float[] diff = { 1.0f, 1.0f, 1.0f, 1.0f, };
 float[] spec = { 1.0f, 1.0f, 1.0f, 1.0f, };
 float[] pos = { 0.0f, 5.0f, 5.0f, 1.0f, };
 float[] spot_dir = { 0.0f, -1.0f, 0.0f, };
 gl.glEnable(GL10.GL_DEPTH_TEST);
 gl.glEnable(GL10.GL_CULL_FACE);
 
 gl.glEnable(GL10.GL_LIGHTING);
 gl.glEnable(GL10.GL_LIGHT0);
 ByteBuffer abb
 = ByteBuffer.allocateDirect(amb.length*4);
 abb.order(ByteOrder.nativeOrder());
 FloatBuffer ambBuf = abb.asFloatBuffer();
 ambBuf.put(amb);
 ambBuf.position(0);
 
 ByteBuffer dbb
 = ByteBuffer.allocateDirect(diff.length*4);
 dbb.order(ByteOrder.nativeOrder());
 FloatBuffer diffBuf = dbb.asFloatBuffer();
 diffBuf.put(diff);
 diffBuf.position(0);
 
 ByteBuffer sbb
 = ByteBuffer.allocateDirect(spec.length*4);
 sbb.order(ByteOrder.nativeOrder());
 FloatBuffer specBuf = sbb.asFloatBuffer();
 specBuf.put(spec);
 specBuf.position(0);
 
 ByteBuffer pbb
 = ByteBuffer.allocateDirect(pos.length*4);
 pbb.order(ByteOrder.nativeOrder());
 FloatBuffer posBuf = pbb.asFloatBuffer();
 posBuf.put(pos);
 posBuf.position(0);
 
 ByteBuffer spbb
 = ByteBuffer.allocateDirect(spot_dir.length*4);
 spbb.order(ByteOrder.nativeOrder());
 FloatBuffer spot_dirBuf = spbb.asFloatBuffer();
 spot_dirBuf.put(spot_dir);
 spot_dirBuf.position(0);
 
 gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, ambBuf);
 gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, diffBuf);
 gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_SPECULAR, specBuf);
 gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, posBuf);
 gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_SPOT_DIRECTION,
 spot_dirBuf);
 gl.glLightf(GL10.GL_LIGHT0, GL10.GL_SPOT_EXPONENT, 0.0f);
 gl.glLightf(GL10.GL_LIGHT0, GL10.GL_SPOT_CUTOFF, 45.0f);
 
 gl.glLoadIdentity();
 GLU.gluLookAt(gl,0.0f, 4.0f, 4.0f, 0.0f, 0.0f, 0.0f,
 0.0f, 1.0f, 0.0f);
 
}


绘制一个球,并使用蓝色材质:

public void drawScene(GL10 gl) {
 super.drawScene(gl);
 
 float[] mat_amb = {0.2f * 0.4f, 0.2f * 0.4f,
 0.2f * 1.0f, 1.0f,};
 float[] mat_diff = {0.4f, 0.4f, 1.0f, 1.0f,};
 float[] mat_spec = {1.0f, 1.0f, 1.0f, 1.0f,};
 
 ByteBuffer mabb
 = ByteBuffer.allocateDirect(mat_amb.length*4);
 mabb.order(ByteOrder.nativeOrder());
 FloatBuffer mat_ambBuf = mabb.asFloatBuffer();
 mat_ambBuf.put(mat_amb);
 mat_ambBuf.position(0);
 
 ByteBuffer mdbb
 = ByteBuffer.allocateDirect(mat_diff.length*4);
 mdbb.order(ByteOrder.nativeOrder());
 FloatBuffer mat_diffBuf = mdbb.asFloatBuffer();
 mat_diffBuf.put(mat_diff);
 mat_diffBuf.position(0);
 
 ByteBuffer msbb
 = ByteBuffer.allocateDirect(mat_spec.length*4);
 msbb.order(ByteOrder.nativeOrder());
 FloatBuffer mat_specBuf = msbb.asFloatBuffer();
 mat_specBuf.put(mat_spec);
 mat_specBuf.position(0);
 
 gl.glMaterialfv(GL10.GL_FRONT_AND_BACK,
 GL10.GL_AMBIENT, mat_ambBuf);
 gl.glMaterialfv(GL10.GL_FRONT_AND_BACK,
 GL10.GL_DIFFUSE, mat_diffBuf);
 gl.glMaterialfv(GL10.GL_FRONT_AND_BACK,
 GL10.GL_SPECULAR, mat_specBuf);
 gl.glMaterialf(GL10.GL_FRONT_AND_BACK,
 GL10.GL_SHININESS, 64.0f);
 
 sphere.draw(gl);
 
}


本例下载

分享到:
评论

相关推荐

    opengl es android demo 程序

    点、线、球休、多面体,光照效果等示例程序源码,想学opengl es android方面的,可以看看!!!

    AndroidOpenGLDemo-master:OpenGL 3D开发原始程序圆顶

    说明这是一个Android OpenGLES2.0从零开始的Demo程序,仅做个人学习OpenGLES的记录,并提供给后来初学者参考。若有相关问题,也非常乐意与大家一起讨论共同进步。关于Android OpenGLES2.0学习的博客,也相当于这个...

    Android 4游戏编程入门经典

     11.3.4 opengl es中如何对光照过程进行运算:顶点法线  11.3.5 实践  11.3.6 关于opengl es中光照应用的一些建议  11.4 材质变换(mipmapping)  11.5 简单的照相机  11.5.1 第一人称照相机或欧拉照相机  ...

    android游戏编程入门

     11.3.4 OpenGL ES中如何对光照  过程进行运算:顶点  法线 442  11.3.5 实践 443  11.3.6 关于OpenGL ES中光照  应用的一些建议 456  11.4 材质变换(Mipmapping) 456  11.5 简单的照相机 460  11.5.1 第一...

    OpenGL编程指南(原书第7版)中文扫描版.pdf.rar

    OpenGL技术资料库(OpenGL technical library)提供了大量的OpenGL教程和参考书籍,它可以帮助程序员深入理解OpenGL,完全释放OpenGL的潜力。这个资料库最初由sgi开发,目前由khronos OpenGL体系结构审核委员会(arb...

    OpenGL超级宝典(第四版)

    第一部分包括第1章到第12章,介绍经典opengl绘图的所有基础知识,包括3d图形和opengl简介,opengl空间绘图,几何转换,颜色、材料和光照,纹理贴图,曲线和表面,管线,交互式图形等内容。第二部分包括第13章到第15...

    opengl超级宝典

    第一部分包括第1章到第12章,介绍经典OpenGL绘图的所有基础知识,包括3D图形和OpenGL简介,OpenGL空间绘图,几何转换,颜色、材料和光照,纹理贴图,曲线和表面,管线,交互式图形等内容。第二部分包括第13章到第15...

    webgl编程指南及源码1/2

    第6 章 OpenGL ES 着色器语言(GLSL ES) 185 回顾:基本着色器代码 186 GLSL ES 概述 186 你好,着色器! 187 基础 187 执行次序 187 注释 187 数据值类型(数值和布尔值) 188 变量 188 GLSL ES 是强类型...

    webgl编程指南及源码2/2

    第6 章 OpenGL ES 着色器语言(GLSL ES) 185 回顾:基本着色器代码 186 GLSL ES 概述 186 你好,着色器! 187 基础 187 执行次序 187 注释 187 数据值类型(数值和布尔值) 188 变量 188 GLSL ES 是强类型...

    WebGL编程指南压缩包

    第6 章 OpenGL ES 着色器语言(GLSL ES) 185 回顾:基本着色器代码 186 GLSL ES 概述 186 你好,着色器! 187 基础 187 执行次序 187 注释 187 数据值类型(数值和布尔值) 188 变量 188 GLSL ES 是强类型...

    WebGL编程指南

    第6 章 OpenGL ES 着色器语言(GLSL ES) 185 回顾:基本着色器代码 186 GLSL ES 概述 186 你好,着色器! 187 基础 187 执行次序 187 注释 187 数据值类型(数值和布尔值) 188 变量 188 GLSL ES 是强类型...

    WebGL编程指南中文高清85M版本+源码

    《WebGL编程指南》的主要篇幅讲解了WebGL 原生API 和三维图形学的基础知识,包括渲染管线、着色器、矩阵变换、着色器编程语言(GLSL ES)等等,也讲解了使用WebGL 渲染三维场景的一般技巧,如光照、阴影、雾化等等。...

Global site tag (gtag.js) - Google Analytics