2009-12-19 2 views
1

Из-за проблем с производительностью мне пришлось перенести код моего андроида opengl с Java на C. Я считаю, что передал весь код OpenGL, но теперь у меня много ошибок в разделе моего код, который рисует растровое изображение как текстуру на экране.Проблемы с рисованием OpenGL ES в Android NDK

Когда я запускаю проект в эмуляторе, текущий код ничего не отображает и, похоже, имеет утечку памяти, поскольку он медленно занимает всю память и заставляет другие приложения закрываться.

Вот код, который контролирует эту часть:

В заголовочном файле:

extern unsigned char colors[1024*512*3]; // 3 bytes per pixel 

В с-файле:

void appRender(int width, int height, unsigned char colors) 
{ 
    unsigned int textureID; 
    float vertices[] = 
    { 
     0.0f, 0.0f, 
     512.0f, 0.0f, 
     0.0f, 1024.0f, 
     512.0f, 1024.0f 
    }; 

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

    unsigned char indices[] = 
    { 
     0, 1, 3, 
     0, 3, 2 
    }; 

    UpdateView(); 


    //onDraw 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glOrthof(0.0f, 320.0f, 430.0f, 0.0f, 1.0f, -1.0f); 

    //texture stuff 
    glGenTextures(1,&textureID); 
    glBindTexture(GL_TEXTURE_2D, textureID); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

    //Different possible texture parameters, e.g 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 512, 1024, 0, GL_RGB ,GL_UNSIGNED_BYTE, colors); 

    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

    glVertexPointer(2, GL_FLOAT, 0, vertices); 
    glTexCoordPointer(2, GL_FLOAT, 0, texture); 

    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices); 

    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
} 

Любая помощь будет принята с благодарностью.

+0

сейчас я люблю тебя так сильно :) - было рвать на себе волосы, пытаясь получить что-то на экране в течение более 2 часов - СПАСИБО ДЛЯ ПРИМЕР! – torger

+0

@torger, что код на самом деле ничего не отображает, он каким-то образом сломан. Я забыл, как я его исправил, вы можете взглянуть на кодовую страницу google для «thelements», хотя мы делаем довольно простой рисунок там. – RyanCheu

+0

Я сделал это работу ха-ха - я тоже не знаю, как я это сделал :) - должен сказать - нет лучшего чувства, чем увидеть этот белый квадрат в первый раз – torger

ответ

3

Для включения текстурирования в вашем примере не существует вызова glEnable(GL_TEXTURE_2D).

Вы можете позвонить по телефону glGetError(), чтобы узнать, верно ли то, что вы делаете. Это помогло мне отлаживать проблемы в прошлом.

Также вы создаете свою текстуру в своем методе appRender(). Если это вызывается для каждого кадра, который вы рисуете, это может быть причиной утечки памяти, поскольку вы неоднократно воссоздаете одну и ту же текстуру.

Обычно вы должны генерировать и определять текстуру один раз во время инициализации.

Таким образом, перед рендерингом должно выполняться следующее.

glGenTextures(1,&textureID); 
glBindTexture(GL_TEXTURE_2D, textureID); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

//Different possible texture parameters, e.g 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 512, 1024, 0, GL_RGB ,GL_UNSIGNED_BYTE, colors); 

Тогда при рисовании вы можете сделать

glEnable(GL_TEXTURE_2D) 
glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glBindTexture(GL_TEXTURE_2D, textureID); 

glVertexPointer(2, GL_FLOAT, 0, vertices); 
glTexCoordPointer(2, GL_FLOAT, 0, texture); 

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices); 

glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
glDisable(GL_TEXTURE_2D) 
+0

Я пробовал это, и он избавился от моей утечки памяти , но я все еще не могу ничего рисовать. Ничего не видно на экране. – RyanCheu

+0

Редактировать: я мог видеть вещи каждый раз, когда я запускал инициализацию. Похоже, что я пропустил что-то из первой части во второй части? – RyanCheu

Смежные вопросы