user529543
user529543

Reputation:

android opengles 2.0 draw string 2d

The Activity load the layout, which has a 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 I took the example and fixed ( added the texture declaration and initialisation line )

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

I am expecting to see my example email, but can't see it.

Note I don't use vertexShaderCode, fragmentShaderCode, nor GLES20.glCreateProgram() . Maybe that is missinng, but can't understand why, where it needed.

How to fix this?

At Logcat I see the doPaintEmail1: foo@example message.

enter image description here

Upvotes: 1

Views: 839

Answers (1)

ClayMontgomery
ClayMontgomery

Reputation: 2832

Creating the vertex and fragment shader programs is required for any OpenGL ES 2.0 app to function. They are not optional. You should take a look at the 2.0 examples in the Android SDK. If you don't want to use shaders, then use OpenGL ES 1.1, instead.

The third article here will guide you to the best examples in the SDK.

Upvotes: 1

Related Questions