android opengl es 位圖字體

一:先總結下今天遇到的問題

(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);
    }
}

 

運行效果:

 

發佈了30 篇原創文章 · 獲贊 19 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章