Проблемы рисования OpenGL ES в Android NDK - PullRequest
1 голос
/ 19 декабря 2009

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

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

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

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

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

В файле c:

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

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

1 Ответ

3 голосов
/ 19 декабря 2009

Похоже, что нет вызова 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...