Chinaunix首页 | 论坛 | 博客
  • 博客访问: 535225
  • 博文数量: 179
  • 博客积分: 3845
  • 博客等级: 中校
  • 技术积分: 2003
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-16 21:25
文章分类
文章存档

2012年(74)

2011年(105)

分类: 嵌入式

2012-01-17 12:38:22

有了灯光,有了贴图,3D的世界已经增色不少,但所有的东西看上去依然像用了相同的壁纸贴出来的一样,不够生动。

要让东西看起来有质感,就需要调整渲染时的材质属性了,与这个词的字面意思很般配,材质就是让东西看去有金属、木质、玻璃、塑料等等材料上的区别。

在 OpenGL ES 中材质的定义由 API 函数 glMaterial 实现,与很多其它的 OpenGL 函数一样,该函数也有几个不同的 fx/v 的变体。Java 实现的定义如下:

1
2
3
4
5
6
void glMaterialf(int face, int pname, float param)
void glMaterialfv(int face, int pname, float[] params, int offset)
void glMaterialfv(int face, int pname, FloatBuffer params)
void glMaterialx(int face, int pname, int param)
void glMaterialxv(int face, int pname, IntBuffer params)
void glMaterialxv(int face, int pname, int[] params, int offset)

名称后缀中一如既往的 f, x 表示设置的值为浮点值还是整数值,v 表示值是数组类型。

face : 要应用材质的面,只接受 GL_FRONT_AND_BACK 常量。

pname : 要设置的材质属性,可以是 GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR, GL_EMISSION, GL_SHININESS, GL_AMBIENT_AND_DIFFUSE 中的一个,分别表示环境光、漫射光、镜面光、自发光、镜面反射强度、环境光与漫射光。

param : 要设置的单个标量值,目前仅适用于GL_SHININESS属性,官方文档表示只接受 0-128 之间的值。

params : 要设置的向量(数组)值。用于除 GL_SHININESS 之外的其它几个属性。而且这向个属性清一色的要求一组由四个浮点或整数组成的颜色值。整数的值会被线性映射为 0-1 之间的浮点数 — 也就是max(int) = 1.0f, min(int) = -1.0f 还有 0 = 0.0f

offset : 在 params 为数组的情况下表示值在数组上的起启位置。这个参数以及 Buffer 类型的 params 都是从 C 到 java 的过程中加入的,以减少 java 没有指针的不便。

要设置物体的材质,只需在调用 draw 函数前调用这些函数进行设置就可以了

1
2
3
4
5
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT_AND_DIFFUSE,
    new float[] { 0.4f, 0.2f, 0.2f, 1f }, 0);
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR,
    new float[] { 1, 1, 1, 1f }, 0);
gl.glMaterialf(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS, 10.0f);

材质与纹理贴图可以一起使用。另外使用材质需要法线数据以进行光照计算。

PS: HTC Desire 的显卡貌似不咋地啊,没办法,智能手机更新换代太快了,看来已经过时了。。。

阅读(2752) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~