您的位置:首页 > 移动开发 > Android开发

android学习笔记之3D---多边形着色(颜色)

2010-10-23 13:06 701 查看
上次学习了绘制2D多边形,我们可以使用OpenGL通过顶点数据绘制出一些图形,但是可以看出我们绘制的图形都是单色的,可想而知我们没有对图形进行着色。

对图形着色有两种方式:1. 光滑着色 2. 平面着色。



平滑着色:

我们对上一个实例中的三角形进行平滑着色,是将三角形的三个顶点的不同颜色混合在一起,就是色彩的混色。

首先为三角形的每个顶点设置一个颜色,和定义三角形数组相似。不同的是,颜色值有(r,g,b,a)

r:red

g:green

b:blue

a:alpha

定义三角形的颜色数组为:

int one = 0x10000;
	private IntBuffer colorBuffer = IntBuffer.wrap(new int[]{
			one,0,0,one,
			0,one,0,one,
			0,0,one,one
	});


和绘制多边形类似,我们使用颜色数组的时候也同样要开启颜色渲染功能。

gl.glEnableClientState(GL10.GL_COLOR_ARRAY);

开启了颜色数组后,和glVertexPointer功能相似的是我们要将定义好的颜色数组渲染到多边形上去。

gl.glColorPointer(4, GL10.GL_FIXED, 0, colorBuffer); //参数和glVertexPointer一样

最后,需要关闭颜色数组.

gl.glDisableClientState(GL10.GL_COLOR_ARRAY);





单调着色:

单调着色会比平滑着色简单很多,实际上就是设置当前所使用的颜色,即设置当前颜色之后绘制的所有内容都使用这个颜色。即使是在完全采用纹理贴图的时候,仍然可以用调节纹理的色调

现在我们只需将颜色依次性的设为理想的颜色(本例采用蓝色),然后绘制场景。这时绘制的每个顶点都是蓝色的。因为我们没有告诉OpenGL要改变顶点的颜色(glEnableClientState)。

这时单调着色的代码是: gl.glColor4f(0.5f, 0.5f, 1.0f, 1.0f);//参数分别为red,green,blue,alpha





注意:glColor4f不需要开启颜色渲染功能,因此,需要在调用glColor4f方法之前使用glDisableClientState方法关闭颜色渲染功能,否则glColor4f方法不起作用。





package com.geolo.android.GL;

import java.nio.IntBuffer;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLSurfaceView.Renderer;
import android.util.Log;

public class GLRender implements Renderer{
int one = 0x10000; private IntBuffer colorBuffer = IntBuffer.wrap(new int[]{ one,0,0,one, 0,one,0,one, 0,0,one,one });
//三角形三个顶点
private IntBuffer triggerBuffer = IntBuffer.wrap(new int[]{
0,one,0, //上顶点
-one,-one,0, //左下点
one,-one,0,}); //右下点
//正方形的4个顶点
private IntBuffer quaterBuffer = IntBuffer.wrap(new int[]{
one,one,0,
-one,one,0,
one,-one,0,
-one,-one,0});

public void onDrawFrame(GL10 gl) {
Log.d(this.getClass().getName(), "onDrawFrame.........");
// 清除屏幕和深度缓存
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

// 三角形
// 重置当前的模型观察矩阵
gl.glLoadIdentity();
// 左移 1.5 单位,并移入屏幕 6.0
gl.glTranslatef(-1.5f, 0.0f, -6.0f);
// 允许设置顶点
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
//设置颜色数组
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
// 设置三角形
gl.glVertexPointer(3, GL10.GL_FIXED, 0, triggerBuffer);
//对三角形平滑着色
gl.glColorPointer(4, GL10.GL_FIXED, 0, colorBuffer);
//绘制三角形
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
//关闭颜色数组
gl.glDisableClientState(GL10.GL_COLOR_ARRAY);

// 正方形
// 重置当前的模型观察矩阵
gl.glLoadIdentity();
// 左移 1.5 单位,并移入屏幕 6.0
gl.glTranslatef(1.5f, 0.0f, -6.0f);
//设置和绘制正方形
gl.glVertexPointer(3, GL10.GL_FIXED, 0, quaterBuffer);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
//对正方形单调着色
gl.glColor4f(0.5f, 0.5f, 1.0f, 1.0f);
// 取消顶点设置
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

}

public void onSurfaceChanged(GL10 gl, int width, int height) {
Log.d(this.getClass().getName(), "onSurfaceChanged.........");
float ratio = (float) width / height;
//设置OpenGL场景的大小
gl.glViewport(0, 0, width, height);
//设置投影矩阵
gl.glMatrixMode(GL10.GL_PROJECTION);
//重置投影矩阵
gl.glLoadIdentity();
// 设置视图的大小
gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
// 选择模型观察矩阵
gl.glMatrixMode(GL10.GL_MODELVIEW);
// 重置模型观察矩阵
gl.glLoadIdentity();
}

public void onSurfaceCreated(GL10 gl, EGLConfig config) {
Log.d(this.getClass().getName(), "onSurfaceCreated.........");
// 启用阴影平滑
gl.glShadeModel(GL10.GL_SMOOTH);
// 黑色背景
gl.glClearColor(0, 0, 0, 0);
// 设置深度缓存
gl.glClearDepthf(1.0f);
// 启用深度测试
gl.glEnable(GL10.GL_DEPTH_TEST);
// 所作深度测试的类型
gl.glDepthFunc(GL10.GL_LEQUAL);
// 告诉系统对透视进行修正
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: