OpenGL ES——打光

基础概念

specular VS diffuse VS ambient

OpenGL ES为我们提供的思路是：将材料对光的反应分为三部分。

specular

float[] specular = {1.0f, 1.0f, 1.0f, 1.0f};
float[] materialSpec = {1.0f, 0.5f, 0.0f, 1.0f,};

diffuse

float[] diffuse = {0.5f, 0.5f, 0.5f, 1.0f};
float[] materialDiff = {0.0f, 0.0f, 1.0f, 1.0f,};

ambient

float[] ambient = {0.9f, 0.9f, 0.9f, 1.0f};
float[] materialAmb = {0.4f, 0.4f, 1.0f, 1.0f,};

位置

float[] lightPosition = {0.5f, 0.5f, 0.5f, 0.0f};
gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, STLUtils.floatToBuffer(lightPosition));

如何使用

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
gl.glEnable(GL10.GL_DEPTH_TEST); // 启用深度缓存
gl.glClearColor(0f, 0f, 0f, 0f);// 设置深度缓存值
gl.glDepthFunc(GL10.GL_LEQUAL); // 设置深度缓存比较函数

//开启光
openLight(gl);
enableMaterial(gl);
float r = model.getR();

//r是半径，不是直径，因此用0.5/r可以算出放缩比例
mScalef = 0.5f / r;
mCenterPoint = model.getCentrePoint();
}

float[] ambient = {0.9f, 0.9f, 0.9f, 1.0f};
float[] diffuse = {0.5f, 0.5f, 0.5f, 1.0f};
float[] specular = {1.0f, 1.0f, 1.0f, 1.0f};
float[] lightPosition = {0.5f, 0.5f, 0.5f, 0.0f};

private void openLight(GL10 gl) {

gl.glEnable(GL10.GL_LIGHTING);
gl.glEnable(GL10.GL_LIGHT0);
gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, STLUtils.floatToBuffer(ambient));
gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, STLUtils.floatToBuffer(diffuse));
gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_SPECULAR, STLUtils.floatToBuffer(specular));
gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, STLUtils.floatToBuffer(lightPosition));

}

float[] materialAmb = {0.4f, 0.4f, 1.0f, 1.0f,};
float[] materialDiff = {0.0f, 0.0f, 1.0f, 1.0f,};
float[] materialSpec = {1.0f, 0.5f, 0.0f, 1.0f,};

public void enableMaterial(GL10 gl) {

//材料对环境光的反射情况
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, STLUtils.floatToBuffer(materialAmb));
//散射光的反射情况
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, STLUtils.floatToBuffer(materialDiff));
//镜面光的反射情况
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, STLUtils.floatToBuffer(materialSpec));

}

70 篇文章27 人订阅

0 条评论

相关文章

新手入门百度地图开发的（0,0）坐标问题

对于大部分人来讲，由于百度地图资料众多，过度依赖搜索引擎等等原因。新接触百度地图开发工作其实并不容易。今天说说关于坐标（0,0）的问题。 ...

3749

3185

比起WE大会“救命的AI”，这个AI已经悄悄进入人们的学习中

“未来人工智能要进一步发展的话，就需从脑科学得到启发，包括机器学习过程，怎么从脑启发的这个概念来设计新的计算模式，新的类似人脑的神经元结构的器件、芯片，甚至是机...

2164

1K9

1494

数据分析：寻找Python最优计算性能

1、场景描述 在数据统计分析过程中，求累计值（总和）是最常用的统计指标之一，市面上的各种流行数据库均支持的查询方式基本如下： select sum(c) fro...

2137

3847

3135

6.4 移位操作符

Cg语言中的移位操作符，功能和C语言中的一样，也可以作用在向量上，但是向量类型必须是int类型。例如：

992

一文盘点三大顶级Python库（附代码）

Python在许多方面有着强大的吸引力 - 例如效率、代码可读性和速度方面，也正因为如此，对于希望提升应用程序功能的数据科学家和机器学习专家来说，Python通...

1484