public class OpenGLRenderer implements Renderer{
Square square=new Square("jay.png");
int angle;
@Override
public void onDrawFrame(GL10 gl) {
// 清理颜色和深度内存
gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
// 设置当前矩阵为单位矩阵
gl.glLoadIdentity();
// 位移
gl.glTranslatef(0, 0, -4);
square.draw(gl);
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
// 设置当前矩阵为投影矩阵
gl.glMatrixMode(GL10.GL_PROJECTION);
// 设置当前矩阵为单位矩阵
gl.glLoadIdentity();
GLU.gluPerspective(gl, 45.0f, (float) width / (float) height, 0.1f, 100.0f);
// 设置当前矩阵为投影矩阵
gl.glMatrixMode(GL10.GL_MODELVIEW);
// 设置当前矩阵为单位矩阵
gl.glLoadIdentity();
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig arg1) {
square.loadBitmap();
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
//设置颜色模式
gl.glShadeModel(GL10.GL_SMOOTH);
// 设置深度缓存值
gl.glClearDepthf(1.0f);
// 启用深度测试
gl.glEnable(GL10.GL_DEPTH_TEST);
// 所作深度测试的类型
gl.glDepthFunc(GL10.GL_LEQUAL);
// 设置渲染质量与速度的平衡
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_NICEST);
}
}
public class Square {
/** 顶点数组 */
public float[] vertices = { -2.0f, 2.0f, 0.0f, -2.0f, -2.0f, 0.0f, 2.0f, -2.0f, 0.0f, 2.0f, 2.0f, 0.0f };
/** 顶点顺序 */
private short[] indices = { 0, 1, 2, 0, 2, 3 };
private float[] mTexture = { 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, };
// 顶点坐标缓存
public FloatBuffer verticesBuffer;
// 顶点顺序缓存
public ShortBuffer indexBuffer;
// 纹理坐标缓存(UV坐标??)
private FloatBuffer mTextureBuffer;
// 纹理id
private int mTextureId = -1;
// 纹理bitmap
private Bitmap mBitmap;
// 是否加载纹理
private boolean mShouldLoadTexture = false;
private String bitmapPath;
public Square(String str) {
// 定义一个byte型的缓存数组,并且赋予数组大小
ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
// 设置缓存的摆放顺序
vbb.order(ByteOrder.nativeOrder());
// 转换成float
verticesBuffer = vbb.asFloatBuffer();
// 加入数组
verticesBuffer.put(vertices);
// 将buffer内游标置回0,否则OpenGL会从最后一次put的下一个位置开始读取。
verticesBuffer.position(0);
// 定义一个byte型的缓存数组,并且赋予数组大小
ByteBuffer ibb = ByteBuffer.allocateDirect(vertices.length * 2);
// 设置缓存的摆放顺序
ibb.order(ByteOrder.nativeOrder());
// 转换成short
indexBuffer = ibb.asShortBuffer();
// 加入数组
indexBuffer.put(indices);
// 将buffer内游标置回0,否则OpenGL会从最后一次put的下一个位置开始读取。
indexBuffer.position(0);
ByteBuffer tbb = ByteBuffer.allocateDirect(mTexture.length * 4);
tbb.order(ByteOrder.nativeOrder());
mTextureBuffer = tbb.asFloatBuffer();
mTextureBuffer.put(mTexture);
mTextureBuffer.position(0);
bitmapPath = str;
}
/** 绘制 */
public void draw(GL10 gl) {
// 设置逆时针为面的“前面”
gl.glFrontFace(GL10.GL_CCW);
// 打开忽略"后面"的设置
gl.glEnable(GL10.GL_CULL_FACE);
// 明确指明忽略哪个面
gl.glCullFace(GL10.GL_BACK);
// 开启 这种渲染方式
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
// 画点(使用VertexBuffer)
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, verticesBuffer);
// 画点(使用Indices)
gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, GL10.GL_UNSIGNED_SHORT, indexBuffer);
if (!mShouldLoadTexture) {
loadGLTexture(gl);
mShouldLoadTexture = true;
}
if (mTextureId != -1 && mTextureBuffer != null) {
// 启动二维纹理
gl.glEnable(GL10.GL_TEXTURE_2D);
// Enable the texture state
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
// Point to our buffers
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, mTextureBuffer);
gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureId);
}
// 关闭这种渲染方式
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
if (mTextureId != -1 && mTextureBuffer != null) {
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
}
// 关闭忽略“后面”设置
gl.glDisable(GL10.GL_CULL_FACE);
}
/** 载入图片 */
public void loadBitmap() {
try {
AssetManager am = MainActivity.mainActivity.getResources().getAssets();
InputStream is = am.open(bitmapPath);
mBitmap = BitmapFactory.decodeStream(is);
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/** 载入纹理 */
private void loadGLTexture(GL10 gl) {
// 创建一个纹理
int[] textures = new int[1];
// 生成纹理,1-纹理数量,2-纹理索引 3-索引的下标(应该是)
gl.glGenTextures(1, textures, 0);
mTextureId = textures[0];
// 绑定该纹理
gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureId);
// 设置Texture需要放大或是缩小时OpenGL的模式(就是设置纹理的属性)
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
// 需要告诉OpenGL库如何去渲染这些不存在的Texture部分(就是设置纹理的属性)(坐标大于1的时候)
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT);
// 将bitmap和纹理绑定在一起
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, mBitmap, 0);
}
}
1 个解决方案
#1
感觉lzopengl es 蛮牛的 能否看一个问题呢 谢谢
http://www.drovik.com/html/2850315731.html