Android OpenGL ES: Textured Triangle

 1 public class MyRenderer implements Renderer 
2 {
3 FloatBuffer verticesBuffer;
4 private final int VERTEX_SIZE = (2 + 2) * 4;
5 private AssetManager asset;
6 private int textureID;
7
8 public MyRenderer(Context context)
9 {
10 asset = context.getAssets();
11 }
12
13 @Override
14 public void onDrawFrame(GL10 gl)
15 {
16 gl.glViewport(0, 0, 320, 480);
17 gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
18 gl.glMatrixMode(GL10.GL_PROJECTION);
19 gl.glLoadIdentity();
20 gl.glOrthof(0, 320, 0, 480, 1, -1);
21
22 gl.glEnable(GL10.GL_TEXTURE_2D);
23 gl.glBindTexture(GL10.GL_TEXTURE_2D, textureID);
24
25 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
26 gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
27
28 verticesBuffer.position(0);
29 gl.glVertexPointer(2, GL10.GL_FLOAT, VERTEX_SIZE, verticesBuffer);
30 verticesBuffer.position(2);
31 gl.glTexCoordPointer(2, GL10.GL_FLOAT, VERTEX_SIZE, verticesBuffer);
32 gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
33
34 }
35
36 @Override
37 public void onSurfaceChanged(GL10 gl, int width, int height)
38 {
39
40 }
41
42 @Override
43 public void onSurfaceCreated(GL10 gl, EGLConfig config)
44 {
45 ByteBuffer byteBuffer = ByteBuffer.allocateDirect(3 * 4 * 4);
46 byteBuffer.order(ByteOrder.nativeOrder());
47 verticesBuffer = byteBuffer.asFloatBuffer();
48 verticesBuffer.put(new float[] {0, 0, 0, 0,
49 320, 0, 1, 0,
50 160, 480, 0.5f, 1});
51 verticesBuffer.flip();
52
53 try {
54 Bitmap bitmap = BitmapFactory.decodeStream(asset.open("bobargb8888.png"));
55 int textureIds[] = new int[1];
56 gl.glGenTextures(1, textureIds, 0);
57 textureID = textureIds[0];
58 gl.glBindTexture(GL10.GL_TEXTURE_2D, textureID);
59 GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
60 gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
61 gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST);
62 }
63 catch (IOException e)
64 {
65 e.printStackTrace();
66 }
67 }
68 }

 整理了一下:

public class MyRenderer implements Renderer 
{
FloatBuffer verticesBuffer;
private final int VERTEX_SIZE = (2 + 2) * 4;
private AssetManager asset;
private int textureID;

public MyRenderer(Context context)
{
asset = context.getAssets();
}

@Override
public void onDrawFrame(GL10 gl)
{
gl.glViewport(0, 0, 320, 480);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrthof(0, 320, 0, 480, 1, -1);

gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glBindTexture(GL10.GL_TEXTURE_2D, textureID);

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

verticesBuffer.position(0);
gl.glVertexPointer(2, GL10.GL_FLOAT, VERTEX_SIZE, verticesBuffer);
verticesBuffer.position(2);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, VERTEX_SIZE, verticesBuffer);
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
}

@Override
public void onSurfaceChanged(GL10 gl, int width, int height)
{

}

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config)
{
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(3 * 4 * 4);
byteBuffer.order(ByteOrder.nativeOrder());
verticesBuffer = byteBuffer.asFloatBuffer();
verticesBuffer.put(new float[] {0, 0, 0, 0,
320, 0, 1, 0,
160, 480, 0.5f, 1});
verticesBuffer.flip();

textureID = loadTexture(gl, "bobargb8888.png");
}

public int loadTexture(GL10 gl, String fileName)
{
int id = 0;
try {
Bitmap bitmap = BitmapFactory.decodeStream(asset.open(fileName));
int textureIds[] = new int[1];
gl.glGenTextures(1, textureIds, 0);
id = textureIds[0];
gl.glBindTexture(GL10.GL_TEXTURE_2D, id);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST);
}
catch (IOException e)
{
e.printStackTrace();
}
return id;
}
}

 

posted @ 2011-12-17 15:59  LiLiNiuNiu  阅读(565)  评论(0编辑  收藏  举报