|
第四部分会介绍如何向三角形添加多种颜色。
在上一个部分我们创建了另一个静态的三角形来证明只有三角形旋转而不是整个视图。我们现在移除这个静态三角形包括与它相关的代码。
java代码:
@Override
public void onDrawFrame(GL10 gl) {
// 定义我们打算在背景上显示的图形颜色
gl.glClearColor(_red, _green, _blue, 1.0f);
// 重设矩阵,使得旋转的角度是一定的
gl.glLoadIdentity();
// 清除绘图缓冲区
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
// 设置旋转的角度不定
gl.glRotatef(_angle, 0f, 1f, 0f);
gl.glColor4f(0.5f, 0f, 0f, 0.5f);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, _vertexBuffer);
gl.glDrawElements(GL10.GL_TRIANGLES, _nrOfVertices, GL10.GL_UNSIGNED_SHORT, _indexBuffer);
}
复制代码
现在我们创建了一个新的缓冲区来保存颜色信息。_colorBuffer缓冲区是一个对象变量,但是我们需要定义颜色以及当我们初始化其他缓冲区时填充该缓冲区,这些在我们的initTriangle()函数中完成。
java代码:
// code snipped
// 来存储颜色的缓冲区
private FloatBuffer _colorBuffer;
// code snipped
private void initTriangle() {
// float has 4 bytes
ByteBuffer vbb = ByteBuffer.allocateDirect(_nrOfVertices * 3 * 4);
vbb.order(ByteOrder.nativeOrder());
_vertexBuffer = vbb.asFloatBuffer();
// short has 2 bytes
ByteBuffer ibb = ByteBuffer.allocateDirect(_nrOfVertices * 2);
ibb.order(ByteOrder.nativeOrder());
_indexBuffer = ibb.aSSHortBuffer();
// float has 4 bytes, 4 colors (RGBA) * number of vertices * 4 bytes
ByteBuffer cbb = ByteBuffer.allocateDirect(4 * _nrOfVertices * 4);
cbb.order(ByteOrder.nativeOrder());
_colorBuffer = cbb.asFloatBuffer();
float[] coords = {
-0.5f, -0.5f, 0f, // (x1, y1, z1)
0.5f, -0.5f, 0f, // (x2, y2, z2)
0.5f, 0.5f, 0f // (x3, y3, z3)
};
float[] colors = {
1f, 0f, 0f, 1f, // point 1
0f, 1f, 0f, 1f, // point 2
0f, 0f, 1f, 1f, // point 3
};
_vertexBuffer.put(coords);
_indexBuffer.put(_indicesArray);
_colorBuffer.put(colors);
_vertexBuffer.position(0);
_indexBuffer.position(0);
_colorBuffer.position(0);
}
复制代码
成员变量_colorBuffer是FloatBuffer型(第四行)的。在initTriangle()函数中我们分配足够的存储空间为新的颜色缓冲区(19到21行)。之后我们创建一个float型的数组有四个值分别对应顶点。结构是RGBA(红色,绿色,蓝色,透明度)因此第一个点是红色,第二个是绿色,第三个是蓝色。最后两步我们将颜色数组放入缓冲区然后设置缓冲区的位置为0.
以上准备结束后,我们可以开始告诉OpenGL ES来使用颜色数组了。这通过函数glEnableClientState()实现,跟_vertexBuffer类似,调用glColorPointer()函数。
java代码:
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// preparation
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
initTriangle();
}
// code snipped
@Override
public void onDrawFrame(GL10 gl) {
// code snipped
// gl.glColor4f(0.5f, 0f, 0f, 0.5f);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, _vertexBuffer);
gl.glColorPointer(4, GL10.GL_FLOAT, 0, _colorBuffer);
gl.glDrawElements(GL10.GL_TRIANGLES, _nrOfVertices, GL10.GL_UNSIGNED_SHORT, _indexBuffer);
}
复制代码
系列之Android 游戏教程(一)的帖子链接http://www.eoeandroid.com/thread-102096-1-1.html
系列之Android 游戏教程(二)的帖子链接http://www.eoeandroid.com/thread-102097-1-1.html
系列之Android 游戏教程(三)的帖子链接http://www.eoeandroid.com/thread-102100-1-1.html
系列之Android 游戏教程(五)的帖子链接http://www.eoeandroid.com/thread-103118-1-1.html
系列之Android 游戏教程(六)的帖子链接http://www.eoeandroid.com/thread-103121-1-1.html
系列之Android 游戏教程(七)的帖子链接http://www.eoeandroid.com/thread-103125-1-1.html |
|