第二章 OpenGLES1.0的纹理贴图
private FloatBuffer vertexBuffer = null ;
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
float[] vertexs = new float[]{
-5.0f, 5.0f, -30.0f,
5.0f, -5.0f, -30.0f,
5.0f, 5.0f, -30.0f,
};
vertexBuffer = ByteBuffer.allocateDirect(vertexs.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();
vertexBuffer.put(vertexs);
vertexBuffer.position(0);
}
public void onDrawFrame(GL10 gl) {
GLES10.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // 清空场景为黑色。
GLES10.glClear(GLES10.GL_COLOR_BUFFER_BIT | GLES10.GL_DEPTH_BUFFER_BIT);// 清空相关缓存。
GLES10.glEnableClientState(GLES10.GL_VERTEX_ARRAY);
GLES10.glVertexPointer(3, GLES10.GL_FLOAT, 0, vertexBuffer);
GLES10.glDrawArrays(GLES10.GL_TRIANGLES, 0, 3);
GLES10.glFlush();
}
private FloatBuffer vertexBuffer = null ;
private int textureId = 0 ;
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
float[] vertexs = new float[]{
-5.0f, 5.0f, -30.0f,
5.0f, -5.0f, -30.0f,
5.0f, 5.0f, -30.0f,
};
vertexBuffer = ByteBuffer.allocateDirect(vertexs.length * 4)
.order(ByteOrder.nativeOrder()).asFloatBuffer();
vertexBuffer.put(vertexs);
vertexBuffer.position(0);
int[] tempArray = new int[1];
GLES10.glGenTextures(1, tempArray, 0);
GLES10.glBindTexture(GLES10.GL_TEXTURE_2D, tempArray[0]);
Bitmap image = BitmapFactory.decodeStream(getResources().openRawResource(R.raw.image_test)) ;
GLUtils.texImage2D(GLES10.GL_TEXTURE_2D, 0, image, 0);
image.recycle();
GLES10.glTexParameterx(GLES10.GL_TEXTURE_2D, GLES10.GL_TEXTURE_MAG_FILTER, GLES10.GL_NEAREST);
GLES10.glTexParameterx(GLES10.GL_TEXTURE_2D, GLES10.GL_TEXTURE_MIN_FILTER, GLES10.GL_NEAREST);
textureId = tempArray[0] ;
}
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
float[] vertexs = new float[]{
-5.0f, 5.0f, -30.0f,
5.0f, -5.0f, -30.0f,
5.0f, 5.0f, -30.0f,
};
vertexBuffer = ByteBuffer.allocateDirect(vertexs.length * 4)
.order(ByteOrder.nativeOrder()).asFloatBuffer();
vertexBuffer.put(vertexs);
vertexBuffer.position(0);
int[] tempArray = new int[1];
GLES10.glGenTextures(1, tempArray, 0);
GLES10.glBindTexture(GLES10.GL_TEXTURE_2D, tempArray[0]);
Bitmap image = BitmapFactory.decodeStream(getResources().openRawResource(R.raw.image_test)) ;
GLUtils.texImage2D(GLES10.GL_TEXTURE_2D, 0, image, 0);
image.recycle();
GLES10.glTexParameterx(GLES10.GL_TEXTURE_2D, GLES10.GL_TEXTURE_MAG_FILTER, GLES10.GL_NEAREST);
GLES10.glTexParameterx(GLES10.GL_TEXTURE_2D, GLES10.GL_TEXTURE_MIN_FILTER, GLES10.GL_NEAREST);
textureId = tempArray[0] ;
float[] texcoods = new float[]{
0, 0,
1, 1,
1, 0,
};
txtCoodsBuffer = ByteBuffer.allocateDirect(texcoods.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();
txtCoodsBuffer.put(texcoods);
txtCoodsBuffer.position(0);
GLES10.glEnable(GLES10.GL_TEXTURE_2D);
}
public void onDrawFrame(GL10 gl) {
GLES10.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // 清空场景为黑色。
GLES10.glClear(GLES10.GL_COLOR_BUFFER_BIT | GLES10.GL_DEPTH_BUFFER_BIT);// 清空相关缓存。
GLES10.glEnableClientState(GLES10.GL_VERTEX_ARRAY);
GLES10.glVertexPointer(3, GLES10.GL_FLOAT, 0, vertexBuffer);
GLES10.glEnableClientState(GLES10.GL_TEXTURE_COORD_ARRAY);
GLES10.glTexCoordPointer(2, GLES10.GL_FLOAT, 0, txtCoodsBuffer);
GLES10.glDrawArrays(GLES10.GL_TRIANGLES, 0, 3);
GLES10.glFlush();
}
而后面在绘制的时候,就是在glDrawArrays之前,调用一次glBindTexture即可,激活某一个纹理,那么绘制的时候就是用的当前的纹理对象。一个纹理的话,默认就始终是它,所以不需要重复glBindTexture了。
下一章将继续更新,关于光照材质等技术点。