1

ここに画像の説明を入力してください

このfont.pngを使用していますが、ゲームでは明確に見えません。ゲームで明確なテキストを描画するにはどうすればよいですか?OpenGL ESでテキストを描画するようなテクスチャにテキストをレンダリングする方が、私のソリューションよりも論理的ですか?

4

2 に答える 2

0

OpenGLコンテキストのブレンディングを有効にしましたか?

OnSurfaceCreated()でこのコードを試してください:

gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
gl.glEnable(GL10.GL_BLEND);

編集: このコードはテクスチャで機能します:テクスチャの名前を「text.png」に変更し、res /raw/に配置するだけです。

//////////////////////////////
// TextureTestActivity.java

package com.TextureTest.TextureTest;
import android.app.Activity;
import android.os.Bundle;
import android.content.Context;
import android.opengl.GLSurfaceView;

public class TextureTestActivity extends Activity {
    private GLSurfaceView mGLView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mGLView = new TextureTestSurfaceView(this);
        setContentView(mGLView);
    }

    @Override
    protected void onPause() {
        super.onPause();
        mGLView.onPause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        mGLView.onResume();
    }
}

class TextureTestSurfaceView extends GLSurfaceView {
    public TextureTestSurfaceView(Context context) {
        super(context);
        setEGLConfigChooser(false);
        setRenderer(new TextureTestRenderer(context));
    }
}

//////////////////////////////
// TextureTestRenderer.java
package com.TextureTest.TextureTest;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.opengl.GLES10;
import android.opengl.GLSurfaceView;
import android.opengl.GLU;
import android.opengl.GLUtils;
public class TextureTestRenderer implements GLSurfaceView.Renderer {
    Context context;
    int textureID;

    float vertices[] = {
            -1.0f,  1.0f, 0.0f,
            -1.0f, -1.0f, 0.0f,
             1.0f,  1.0f, 0.0f,
             1.0f, -1.0f, 0.0f
             };

    float texcoords[] = {
            0.0f, 0.0f,
            0.0f, 1.0f,
            1.0f, 0.0f,
            1.0f, 1.0f,
            };

    FloatBuffer texCoordBuffer;
    FloatBuffer vertexBuffer;

    TextureTestRenderer(Context context) {
        this.context = context;
    }

    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        // set gl options
        gl.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);

        gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
        gl.glEnable(GL10.GL_BLEND);

        // create texture
        int textures[] = new int[1];
        gl.glGenTextures(1, textures, 0);
        textureID = textures[0];

        gl.glBindTexture(GL10.GL_TEXTURE_2D, textureID);
        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);

        InputStream is = context.getResources().openRawResource(R.raw.text);
        Bitmap textBitmap = BitmapFactory.decodeStream(is);

        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, textBitmap, 0);
        textBitmap.recycle();

        // create vertex and texcoord buffers
        ByteBuffer vbb = ByteBuffer.allocateDirect(4 * 3 * 4);
        vbb.order(ByteOrder.nativeOrder());
        vertexBuffer = vbb.asFloatBuffer();

        ByteBuffer tbb = ByteBuffer.allocateDirect(4 * 2 * 4);
        tbb.order(ByteOrder.nativeOrder());
        texCoordBuffer = tbb.asFloatBuffer();

        for (int v = 0; v < 4; v++)
            for(int c = 0; c < 3; c++)
                vertexBuffer.put(vertices[v * 3 + c]);

        for (int v = 0; v < 4; v++)
            for(int c = 0; c < 2; c++)
                texCoordBuffer.put(texcoords[v * 2 + c]);

        vertexBuffer.position(0);
        texCoordBuffer.position(0);

        // set up view matrices
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();

        GLU.gluLookAt(gl, 0.0f, 0.0f, 5.0f,
                          0.0f, 0.0f, 0.0f,
                          0.0f, 1.0f, 0.0f);
    }

    public void onDrawFrame(GL10 gl) {
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

        gl.glEnable(GL10.GL_TEXTURE_2D);
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

        gl.glBindTexture(GL10.GL_TEXTURE_2D, textureID);
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
        gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, texCoordBuffer);

        gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
    }

    public void onSurfaceChanged(GL10 gl, int width, int height) {
        GLES10.glViewport(0, 0, width, height);
    }
}
于 2012-04-23T20:58:49.940 に答える
0

私はこれが少し遅いことを知っています...しかしこれはフィルタリングの問題のようです。テクスチャに(「線形」ではなく)「最も近い」フィルタリングを使用してみてください。これは次の方法で実行できます。

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_NEAREST );

レンダリングする前にこれを呼び出します。レンダリング後に両方のメソッドを再度呼び出すことで「線形」フィルタリングに戻すことができますが、GL10.GL_LINEARの代わりにを使用しGL10.GL_NEARESTます。

ただし、両方の呼び出しは必要ありません。最初の呼び出しは、テクスチャが実際の解像度よりも小さくレンダリングされる場合、2番目の呼び出しはテクスチャが大きくレンダリングされる場合です。私の経験では、テキストを読みやすくするには、小さくレンダリングする場合は「最も近い」フィルタリングを使用し、大きくレンダリングする場合は「線形」を使用するのが最適です。しかし、それは主観的なものなので、実験して自分に最適なものを見つける必要があります。

于 2012-10-23T10:14:39.230 に答える