我有一个RGB值的字节数组,就像* .bmp文件的内容(没有标题)一样。我想要做的是,使用OpenGL在Android上绘制相应的位图。
似乎OpenGL ES没有单一的API可以做到,这是真的吗?
如果是,我该怎么做?
PS:实际上,我可以用JAVA代码绘制它,但它太慢而且花费太多的CPU时间。所以我想尝试用OpenGL绘制它。还有其他建议吗?或者OpenGL可能不是正确的答案?
谢谢大家!
答案 0 :(得分:4)
bmp是一个非常糟糕的格式,你应该使用png文件。它们更小,质量相同。使用openGL也很容易使用它们。
您可以在Android中轻松完成。 你会想看看纹理加载。这是一个链接:http://qdevarena.blogspot.com/2009/02/how-to-load-texture-in-android-opengl.html
答案 1 :(得分:0)
这是一个非常普遍的问题,你可以在网上找到很多Android OpenGL ES代码样本。
然而,一个良好的开端将是Google IO为Android编写实时游戏的谈话:http://code.google.com/events/io/2009/sessions/WritingRealTimeGamesAndroid.html
http://www.androidphonethemes.com/google-io-2010-writing-real-time-games-for-android-redux
请参阅我刚刚链接的第一个演示文稿的第23至25页,以比较Android中现有的不同Canvas和OpenGL ES绘图方法。
答案 2 :(得分:-1)
我不确定您得到的答案是否与您提出的问题有关。我相信我也有同样的问题,但是我对在屏幕上绘制位图不感兴趣,我对 创建 (在屏幕上绘制 ),可以使用GL而不是Java计算来快速生成位图。 由于我在网络上的任何地方都找不到问题的答案,因此我才开始阅读GL API,而解决问题的方法是在其他地方打开“ grabdata”标志后,使用glReadPixels读取onDrawFrame方法绘制的像素在程序中,如下所示:
// imports
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import javax.microedition.khronos.opengles.GL10;
import android.graphics.Bitmap;
import android.opengl.GLES20;
//somewhere inside the class that implements GLSurfaceView.Renderer:
ByteBuffer data;
private int height;
private int width;
boolean grabdata=false;
public void onSurfaceChanged(GL10 glUnused, int width, int height) {
this.width=width;
this.height=height;
data=ByteBuffer.allocateDirect(width*height*4).order(ByteOrder.nativeOrder());
/*
......
prepare the surface
.......
*/
}
public void onDrawFrame(GL10 glUnused) {
/*
actually draw whatever you want, set matrices, rotate, draw etc...
drawTriangle(mTriangleVertices);
.
.
.
*/
if (grabdata) {
GLES20.glReadPixels(0,0,width, height, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE,data);
grabdata=false; //until we want to read again
//create a bitmap now if you havent prepared it somewhere else.
Bitmap.Config conf = Bitmap.Config.ARGB_8888;
Bitmap bitmap = Bitmap.createBitmap(width, height, conf);
bitmap.copyPixelsFromBuffer(data);
//do something with it....
// storeImage(bitmap);
data.clear();
}
}