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

openGL光照系统 openGL光照系统分成了三部分:光源,材质光照环境。(openGL没有考虑光的折射)1.      控制光源:第一个参数表示设置哪一个光源的属性,第二个参数表示设置这个光源的哪个属性,第三个参数则表示把该属性值设置为多少;               glLightfv(GL_LIGHT0, GL_POSITION, sun_light_position);GL_POSITION表示光源所处的位置,其值用(X,Y,Z,W)来表示,如果W为0的话表示光源在无    限远处,前三个值则表示了它的方向,这种 阅读详情

设置物体表面材料(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);
 
}


本例下载

 

 

Android OpenGL ES学习笔记之材质概念和添加光照 一、光照概念 观察一个真实的3D物体,在不同的部位必然有不同的光照效果,有的地方暗一点,有的地方亮一点。而这种视觉差异是由光源和材质(物体的材料)共同决定的。光源强度由红、绿、蓝三色光强度共同决定,最终的光照效果由4部分组成: - Emitted(光源) - diffuse(漫反射光) - specular(镜面反射光) - ambient(环境光) 这里附上一张网上的图: 阅读详情

相关推荐

在ABAQUS中使用VUMAT子程序实现Hashin失效准则的详细解析与实践:深入探讨复合材料模拟仿真的高级编程技巧

Hashin失效准则是由材料科学家Shlomo Hashin于1962年提出的一种基于能量方法的多向失效理论,主要用于预测复合材料的破坏行为。与传统的单向失效理论不同,Hashin准则考虑了材料内部的多种独立破坏机制,如基体断裂、界面脱粘、纤维断裂等,这些机制在不同应力状态下可能同时或分别发生。通过计算各个机制的能量释放率,Hashin失效准则能够更为准确地预测复合材料在复杂应力状态下的破坏行为。

qq_38334677的博客 1908

Android OpenGL ES 简明开发教程七:材质渲染

http://www.imobilebbs.com/wordpress/?p=1571   新建一个SimplePlane类 package com.lau.gl03; public class SimplePlane extends Mesh { public SimplePlane() { this(1, 1); } public SimplePlane(float w

laukaka的专栏 1324

基于Simulink的电机驱动逆变器仿真

本文完成了电机驱动逆变器的Simulink多层级仿真平台搭建,实现了:✅ 构建了从理想到器件级的逆变器模型体系✅ 实现了Si/SiC损耗精确计算与结温预测✅ 建模了母线寄生参数、死区效应、栅极驱动等关键非理想特性✅ 支持故障注入与保护策略验证✅ 集成了热管理、EMI、寿命预测与碳足迹评估。

amy_mhd的博客 55

OpenGL】笔记十七、网格类(复杂模型的存储与渲染)

1. 流程 完成了assimp的配置,接下来就进入到模型环节了,首先是网格(Mesh),它代表的是单个的可绘制实体,我们现在先来定义一个我们自己的网格类。 一个网格应该至少需要一系列的顶点,每个顶点包含一个位置向量、一个法向量和一个纹理坐标向量。一个网格还应该包含用于索引绘制的索引以及纹理形式的材质数据(漫反射/镜面光贴图)。 既然我们有了一个网格类的最低需求,我们可以在OpenGL中定义一个顶点了,我们将所有需要的向量储存到一个叫做Vertex的结构体中,我们可以用它来索引每个顶点属性。: struct

ycrsw的博客 628

OpenGL加载模型 之网格

所以我们要做的第一件事,就是加载一个模型文件为scene对象,然后获取每个节点对应的Mesh对象(我们需要递归搜索每个节点的子节点来获取所有的节点),并处理每个Mesh对象对应的顶点数据、索引以及它的材质属性。最终我们得到一个只包含我们需要的数据的Mesh集合。

少年的博客 1162

Android OpenGL ES 开发教程 27 材质光照示例

Android OpenGL ES 开发教程 27 材质光照示例

bcghgfr的博客 258

Android OpenGL ES 开发教程(25)OpenGL光照模型

前面绘制球体时Android OpenGL ES 开发教程(22):绘制一个球体 ,为了能看出3D效果,给场景中添加光源。如果没有光照,绘出的球看上去和一个二维平面上圆没什么差别,如下图,左边为有光照效果的球体,右边为同一个球体但没有设置光源,看上去就没有立体效果,因此OpenGL 光照效果对显示3D效果非常明显。 在OpenGL 光照模型中光源和光照效果可以细分为红,绿,蓝三个部分,光源由

jeanszu的专栏 1778

Android OpenGL ES 开发教程 从入门到精通

本文转自:http://blog.csdn.net/mapdigit/article/details/7526556   Android OpenGL ES 简明开发教程 Android OpenGL ES 简明开发教程一:概述Android OpenGL ES 简明开发教程二:构造OpenGL ES ViewAndroid OpenGL ES 简明开发教程三:3D绘图基本概念A

大写的Z 1万+

Android平台OpenGL ES光照效果实战详解

在移动端做光照,从来都不是“越复杂越好”,而是要在画质 vs 性能 vs 兼容性之间找到最佳平衡点。✅ 成功的关键在于:- 主光源用方向光(高效)- 局部亮点用点光源(可控)- 特殊交互用聚光灯(精准)- 材质合理搭配颜色乘法规则- 多光源动态管理,按需启用掌握这些原则后,你会发现:哪怕只用两个光源,也能做出令人惊艳的效果!💥“最棒的画面,往往诞生于克制的设计。” —— 一名被低端机折磨过的图形程序员 😂本文还有配套的精品资源,点击获取。

weixin_30789053的博客 446

Android OpenGL ES材质光照示例

转自:http://blog.csdn.net/mapdigit/article/details/7647568

zhangjikuan的专栏 1395

PID温控 -第一个版本_pid_PID算法_PID温度_stm32f4_PID温控

基于STM32F4单片机,利用PID算法进行温度的自动控制,使温度达到目标值,并将波动误差控制在0.5度范围内。DS18B20作为温度传感器,驱动采用L298n,控制TEC1-12706进行控温

上一篇: 引路蜂地图API:地图对象类层次关系
下一篇: Android ApiDemos示例解析(20):App->Alarm->Alarm Service
引路蜂
博客等级 码龄15年 3122粉丝 711原创
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值