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



我是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);
        }
        ....
        ....
}

我试图映射纹理,因为它是教这里和这里没有成功。我真的不知道该怎么把一些字母画在正方形上,我真的迷路了……也许文本被绘制在正方形的另一面,也许纹理没有被生成……我不知道。

好吧,我忘了启用纹理映射。您可以在使用GL10对象的任何方法中执行此操作。我更喜欢在我的对象的绘制方法中这样做,所以任何其他对象都不会受到纹理的影响。它就像这样简单(只是改变了两行,那一行写着NEW!!):

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
}

最新更新