android opengles 2.0绘制字符串2d

时间:2013-11-04 09:08:22

标签: java android opengl-es-2.0

Activity加载布局,其中包含GLSurfaceView

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_mixed);

    Bundle bundle = getIntent().getExtras();
    if (bundle.containsKey(EXTRA_KEY_EMAIL)) {
        email = bundle.getString(EXTRA_KEY_EMAIL);
        TextView myTextView = (TextView) findViewById(R.id.myTextView);
        myTextView.setText(myTextView.getText() + " " + email);
    }
    myGLRenderer.setEmail(email);

    myGLSurfaceView = (GLSurfaceView) findViewById(R.id.myGLSurfaceView);

    // Create an OpenGL ES 2.0 context.
    myGLSurfaceView.setEGLContextClientVersion(2);

    // Set the Renderer for drawing on the GLSurfaceView        
    myGLSurfaceView.setRenderer(myGLRenderer);      

    // Render the view only when there is a change in the drawing data
    myGLSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);         
}

From here我拿了例子并修复了(添加了纹理声明和初始化行)

public class MyGLRenderer implements GLSurfaceView.Renderer {

    private static final String TAG = "MyGLRenderer";

    private String email;
    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        Log.e(TAG, "onSurfaceCreated: " + config);
        GLES20.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);//gray this is done
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        Log.e(TAG, "onSurfaceChanged: width" + width + ",  height:" + height);
        GLES20.glViewport(0, 0, width, height);
    }

    @Override
    public void onDrawFrame(GL10 gl) {
        // Redraw background color
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
        doPaintEmail1(gl);
    }

    private void doPaintEmail1(GL10 gl) {

        // TODO do draw all stuff here: paint the email
        Log.v(TAG, "doPaintEmail1: "+email);

        // Create an empty, mutable bitmap
        Bitmap bitmap = Bitmap.createBitmap(256, 256, Bitmap.Config.ARGB_8888);
        // get a canvas to paint over the bitmap
        Canvas canvas = new Canvas(bitmap);
        bitmap.eraseColor(0);

        // get a background image from resources
        // note the image format must match the bitmap format
        //Drawable background = context.getResources().getDrawable(R.drawable.background);
        //background.setBounds(0, 0, 256, 256);
        //background.draw(canvas); // draw the background to our bitmap

        // Draw the text
        Paint textPaint = new Paint();
        textPaint.setTextSize(12);
        textPaint.setAntiAlias(true);
        textPaint.setARGB(0xff, 0xFF, 0x00, 0x00);
        // draw the text centered
        canvas.drawText(email, 16,112, textPaint);

        int[] textures = new int[1];
        //Generate one texture pointer...
        gl.glGenTextures(1, textures, 0);
        //...and bind it to our array
        gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);

        //Create Nearest Filtered Texture
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);

        //Different possible texture parameters, e.g. GL10.GL_CLAMP_TO_EDGE
        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);

        //Use the Android GLUtils to specify a two-dimensional texture image from our bitmap
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);

        //Clean up
        bitmap.recycle();

    }

    public void setEmail(String email) {
        this.email = email;
    }

我希望看到我的示例电子邮件,但看不到它。

注意我不使用vertexShaderCodefragmentShaderCode,也不使用GLES20.glCreateProgram()。也许这是错过的,但无法理解为什么,它需要的地方。

如何解决这个问题?

在Logcat,我看到了doPaintEmail1: foo@example消息。

enter image description here

1 个答案:

答案 0 :(得分:1)

创建顶点和片段着色器程序是任何OpenGL ES 2.0应用程序运行所必需的。它们不是可选的。您应该看一下Android SDK中的2.0示例。如果您不想使用着色器,请改用OpenGL ES 1.1。

第三篇文章here将指导您使用SDK中的最佳示例。