在正方形上绘制文本作为纹理不会显示任何内容

时间:2011-09-14 15:18:38

标签: android opengl-es textures augmented-reality texture2d

我是OpenGL的新手,我正在为Android开发增强现实应用程序。

到目前为止,我正在绘制垂直于相机的白色方块,将用户指向“兴趣点”的方向。

现在,我正试图在正方形中显示一些文字。

我已经阅读了很多内容,似乎用文本创建纹理是最直接和最简单的方法,因此我在获取感兴趣点的数据后立即创建纹理并将其粘贴到他们的广场。为此,我使用位图。

让我们看一些代码。在我的onDrawFrame方法中,我做了类似这样的事情:

public void onDrawFrame(GL10 gl) {

        // Get sensors matrix
                ...


        //Clear Screen And Depth Buffer
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

        // Load remapped matrix
        gl.glMatrixMode(GL10.GL_MODELVIEW);



        // List of Points of interest (modified when some data is downloaded)
        synchronized (poiList) {

            if(mNewData){  // True if new data has been dowloaded)
                if(textures != null)  // Delete old textures
                    gl.glDeleteTextures(textures.length, textures, 0);

                textures = loadGLTexture(gl, soapPoiList.getPoiList());
                mNewData = false;
            }

            int i = 0;
            // Iterate the list
            for (PointOfInterest c : poiList) {

                         gl.glLoadIdentity();
                 gl.glLoadMatrixf(remappedRotationMatrix, 0);

                 // Get bearing
                             ...

                 // Place polygon in the right place
                 gl.glRotatef(-bearing, 0, 0, 1);
                 gl.glTranslatef(0, ICONS_SIZE_RATIO, 0);

                         // Actually draws the polygon with text
                 c.draw(gl, textures[i]);

                 i++;
            }
        }
    }

loadGLTextures的位置是:

protected int[] loadGLTexture(GL10 gl, List<PointOfInterest> l){
    int res[] = new int[l.size()];
    gl.glGenTextures(res.length, res, 0);
    int i = 0;

    for(PointOfInterest p : l) {
        Bitmap bitmap = Bitmap.createBitmap(256, 256, Bitmap.Config.RGB_565);
        bitmap.eraseColor(Color.BLACK);

        Canvas canvas = new Canvas(bitmap);

        Paint textPaint = new Paint();
        textPaint.setTextSize(35);
        textPaint.setFakeBoldText(true);
        textPaint.setAntiAlias(true);
        textPaint.setARGB(255, 255, 255, 255);
        // Draw the text centered
        canvas.drawText(Float.toString(p.getDinstanceToOrigin()) + " m.", 10,35, textPaint);

        // Bind the texture to our array
        gl.glBindTexture(GL10.GL_TEXTURE_2D, res[i]);

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

        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);

        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);

        bitmap.recycle();

        i++;
    }
    return res;
}

它基本上为每个兴趣点创建一个位图,并用它生成一个纹理。纹理将在稍后的白色方块上应用,如此类所示:

    public class PointOfInterest {

        // MEMBERS ----------------------------------------------------------------
            ....
            ....

        // OpenGL necessary variables
        /** The buffer holding the vertices */
        private FloatBuffer vertexBuffer;

        /** The initial vertex definition */
        private float vertices[] = { 
                                    -1.0f, 0.0f, -1.0f, //Bottom Left   V1
                                    -1.0f, 0.0f,  1.0f, //Top Left      V2
                                     1.0f, 0.0f, -1.0f, //Bottom Right  V3
                                     1.0f, 0.0f,  1.0f, //Top Right     V4
                                   };

        private FloatBuffer textureBuffer;
        private float texture[] = {
                                    0.0f, 0.0f,     // V1
                                    1.0f, 0.0f,     // V3
                                    0.0f, 1.0f,     // V2
                                    1.0f, 1.0f      // V4
        };

        // CONSTRUCTORS -----------------------------------------------------------

        public PointOfInterest(Location originLocation){
            currentLocation = originLocation;

            mPoiLocation = new Location(LocationManager.GPS_PROVIDER);

            ByteBuffer byteBuf = ByteBuffer.allocateDirect(vertices.length * 4);
            byteBuf.order(ByteOrder.nativeOrder());

            vertexBuffer = byteBuf.asFloatBuffer();
            vertexBuffer.put(vertices);
            vertexBuffer.position(0);

            byteBuf = ByteBuffer.allocateDirect(texture.length * 4);
            byteBuf.order(ByteOrder.nativeOrder());

            textureBuffer = byteBuf.asFloatBuffer();
            textureBuffer.put(texture);
            textureBuffer.position(0);
        }

        // PUBLIC METHODS ---------------------------------------------------------

        public void draw(GL10 gl, int textureId){
            // Bind the previously generated texture
            gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);

            // Point to our buffers
            gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
            gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

            // set the colour for the square
            //gl.glColor4f(0.0f, 0.1f, 0.0f, 0.5f);

            //Set the face rotation
            gl.glFrontFace(GL10.GL_CW);

            //Point to our vertex buffer
            gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
            gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);

            //Draw the vertices as triangle strip
            gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length / 3);

            //Disable the client state before leaving
            gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
            gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
        }

        ....
        ....
}

我试图在教授herehere时映射纹理但没有成功。我真的不知道该怎么做才能在广场上画出一些字母而且我真的迷失在这里......也许文字是在广场的另一面画的,也许纹理没有生成......我不知道。

非常感谢任何形式的帮助。

1 个答案:

答案 0 :(得分:2)

好的,我忘了启用纹理贴图。您可以在使用GL10对象的任何方法中执行此操作。我更喜欢在我的对象的draw方法中执行它,因此任何其他对象都不受纹理的影响。它就这么简单(只改了两行,就是那些说新!!):

public void draw(GL10 gl, int textureId){
    gl.glEnable(GL10.GL_TEXTURE_2D);    //NEW !!! Enable Texture Mapping

    // Bind the previously generated texture
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);

    // Point to our buffers
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

    // set the colour for the square
    //gl.glColor4f(0.0f, 0.1f, 0.0f, 0.5f);

    //Set the face rotation
    gl.glFrontFace(GL10.GL_CW);

    //Point to our vertex buffer
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);

    //Draw the vertices as triangle strip
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length / 3);

    //Disable the client state before leaving
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

    gl.glDisable(GL10.GL_TEXTURE_2D);   ////NEW !!! Disable texture mapping
}