OpenGL es glDrawTexfOES () 2D-текстура не отображается - PullRequest
0 голосов
/ 09 марта 2012

Прежде всего, я знаю, что это дублированный вопрос, и я проверяю другие вопросы, но это не помогло! Я пытаюсь конвертировать мою игру для Android из системы холста в GL10. После долгих поисков я решил сделать это для исполнителей. Во всяком случае, я пытался создать класс, который загружает и рисует текстуры. Проблема в том, что на моем синем экране появляются черные текстуры. Я не уверен, смогу ли я нарисовать текстуру без создания меша или чего-то в этом роде, но я пытаюсь это сделать. Я только пытаюсь нарисовать 2D текстуру по своим размерам, поэтому я думаю, что меш не нужен. Вот мои коды:

onSurfaceCreated

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        gl.glClearColor(0.0f, 0.0f, 1.0f, 0.2f);
        gl.glClearDepthf(1.0f);
        gl.glViewport(0, 0, 800,  480);

        gl.glShadeModel(GL10.GL_SMOOTH);
        gl.glEnable(GL10.GL_DEPTH_TEST);
        gl.glEnable(GL10.GL_TEXTURE_2D);
        gl.glDepthFunc(GL10.GL_LEQUAL);
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
        //gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
        gl.glLoadIdentity();
        // This is the class where I load and draw my textures.
        textureStorage = new TextureStorage(gl);
        //I'm loading a texture.      **CODE A TEXTURE LOADER**
        bgNightID  = textureStorage.Load(BitmapFactory.decodeResource(context.getResources(),R.drawable.bg_game));
        //This is where I load my units variables. Nothing to do with it.
        RenderingFunctions.InitUnits(this);
    }

onDrawFrame

@Override
public void onDrawFrame(GL10 gl) {
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    gl.glLoadIdentity();
    //gl.glTranslatef(0, 0, -4);
        **CODE B DRAWING**
        // bgNightID is the ID of texture was loaded.
        textureStorage.DrawTexture(bgNightID, 50,50,0,(short)4000,(short)638);
        // Drawing background right here which is shows up black. 
}

КОДОВОЙ ПОГРУЗЧИК ТЕКСТУРЫ

public int glLoad( Bitmap bitmap ){
    if ( gl == null ){
        Log.e(TAG, "Failed to load resource.  Context/GL is NULL");return -1;
    }
    int textureName = -1;
    gl.glGenTextures(1, TexIDStorage, 0);
    textureName = TexIDStorage[0];

    Log.d(TAG, "Generated texture: " + textureName);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureName);

    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_MIN_FILTER, GL10.GL_NEAREST);
    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);
    gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE);

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

    int error = gl.glGetError();
    if (error != GL10.GL_NO_ERROR){ 
        Log.e(TAG, "GL Texture Load Error: " + error);
    }else
        Log.d(TAG, "Loaded texture: " + textureName);
    return textureName;
}

КОД B ЧЕРТЕЖ

public void DrawTexture(int TexutreID, float X, float Y, float Z, short Width, short Height){
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    //gl.glColor4f(1.0f, 1.0f, 1.0f, 0.5f);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, TexIDStorage[TexutreID]);
    ((GL11Ext) gl).glDrawTexfOES(X, Y, Z, Width, Height);
}

Я совершенно новичок в GL10 и не могу понять, в чем проблема и в чем я скучаю. Так что, если кто-нибудь сможет мне помочь, это было бы здорово. Спасибо, что дали время!

Ответы [ 2 ]

2 голосов
/ 09 марта 2012

Я почти уверен, что ширина и высота текстур должны быть степенью 2 для правильного отображения.Попробуйте масштабировать ваше растровое изображение, чтобы оно стало степенью 2.

1 голос
/ 09 марта 2012

Ну, я тоже не большой эксперт по OpenGL, но из того, что я вижу в вашем коде, немного странно то, как вы загружаете свое изображение, а именно эта часть:

bgNightID  = textureStorage.Load(BitmapFactory.decodeResource(context.getResources(),R.drawable.bg_game));

Я просто создаю экземпляр растрового изображения примерно так:

InputStream is = appContext.getResources().openRawResource(R.drawable.whateverId);
Bitmap bitmap =  = BitmapFactory.decodeStream(is);

А затем передайте это GLUtils:

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

также я никогда не звоню glTexEnv:

//I don't do this:
gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...