一:先總結下今天遇到的問題
(1)opengl如何繪製字符串
最終參考了以下網址
http://xmchang.bokee.com/6922990.html
(2)關於座標問題
參考
http://blog.csdn.net/cjkwin/archive/2010/11/17/6016224.aspx
以前沒有重視這個問題,今天好好看了下,發現各座標應如下圖所示
a:vertex即正文體頂點座標
b:texCoord即紋理座標
先聲明,僅代表個人觀點,還是要自己試試才知道,不要一味聽別人說
二代碼:
好了,把今天的座標傳上來
(1)Activity類
package sim.feel;
import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
public class BitmapFont extends Activity {
GLSurfaceView glSurfaceView;
MyRenderer myRenderer;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myRenderer = new MyRenderer();
glSurfaceView = new GLSurfaceView(this);
glSurfaceView.setRenderer(myRenderer);
setContentView(glSurfaceView);
}
}
(2)Renderer類
package sim.feel;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.IntBuffer;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.opengl.GLSurfaceView.Renderer;
import android.opengl.GLUtils;
public class MyRenderer implements Renderer {
static int one = 0x10000;
// 正方形頂點
private IntBuffer quaBuffer;
private int[] qua = new int[] {
-2 * one, -2 * one, 0,
2 * one, -2 * one,0,
-2 * one, 2 * one, 0,
2 * one, 2 * one, 0
};
// 正方形紋理
private IntBuffer texBuffer;
private int[] texCoord = {
0, one,
one, one,
0, 0,
one, 0
};
// 紋理相關
private int[] textures = new int[1];
// Bitmap對象
private Bitmap bmp;
// draw text to bitmap
public void initBitmap() {
String mstrTitle = "文字渲染到Bitmap!";
bmp = Bitmap.createBitmap(256, 256, Bitmap.Config.ARGB_8888);
Canvas canvasTemp = new Canvas(bmp);
canvasTemp.drawColor(Color.BLACK);
Paint p = new Paint();
String familyName = "宋體";
Typeface font = Typeface.create(familyName, Typeface.BOLD);
p.setColor(Color.RED);
p.setTypeface(font);
p.setTextSize(27);
canvasTemp.drawText(mstrTitle, 0, 100, p);
}
@Override
public void onDrawFrame(GL10 gl) {
// 清除顏色和深度緩存
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
// 重置當前的模型觀察矩陣
gl.glLoadIdentity();
ByteBuffer byteBuffer2 = ByteBuffer.allocateDirect(qua.length * 4);
byteBuffer2.order(ByteOrder.nativeOrder());
quaBuffer = byteBuffer2.asIntBuffer();
quaBuffer.put(qua);
quaBuffer.position(0);
ByteBuffer byteBuffer1 = ByteBuffer.allocateDirect(texCoord.length * 4);
byteBuffer1.order(ByteOrder.nativeOrder());
texBuffer = byteBuffer1.asIntBuffer();
texBuffer.put(texCoord);
texBuffer.position(0);
// 允許設置頂點
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
// 移入屏幕6.0
gl.glTranslatef(0.0f, 0.0f, -6.0f);
// 設置正方形
gl.glVertexPointer(3, GL10.GL_FIXED, 0, quaBuffer);
//
gl.glTexCoordPointer(2, GL10.GL_FIXED, 0, texBuffer);
// 繪製正方形
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
// 取消頂點設置
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
float ratio = (float) width / height;
// 設置OpenGL場景的大小
gl.glViewport(0, 0, width, height);
// 設置投影矩陣
gl.glMatrixMode(GL10.GL_PROJECTION);
// 重置投影矩陣
gl.glLoadIdentity();
// 設置視口的大小
gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
// 設置觀察矩陣模型
gl.glMatrixMode(GL10.GL_MODELVIEW);
// 重置當前模型觀察矩陣
gl.glLoadIdentity();
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
initBitmap();
// 告訴系統對透視進行修正
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
// 黑色背景
gl.glClearColor(0, 0, 0, 0);
// 啓用陰影平滑
gl.glShadeModel(GL10.GL_SMOOTH);
// 設置深度緩存
gl.glClearDepthf(1.0f);
// 啓用深度測試
gl.glEnable(GL10.GL_DEPTH_TEST);
// 所做深度測試的類型
gl.glDepthFunc(GL10.GL_LEQUAL);
// 啓用紋理
gl.glEnable(GL10.GL_TEXTURE_2D);
// 創建紋理
gl.glGenTextures(1, textures, 0);
// 綁定紋理
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
// 生成紋理
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bmp, 0);
// 線性濾波
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,
GL10.GL_LINEAR);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,
GL10.GL_LINEAR);
}
}
運行效果: