PMG

Форумы по созданию игр
Текущее время: 05 дек 2024 20:49

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: наложение текстур из буффера
СообщениеДобавлено: 04 окт 2015 15:43 
Не в сети
Новичок

Зарегистрирован: 03 окт 2015 21:23
Сообщения: 7
Всем привет! Пишу программу для андроид используется GLES 2, пытаюсь наложить текстур из буффера, но ничего не выходит, просто зеленый экран и все! помогите кто знает, вот код из draw

glGenTextures(1, &texture_id[0]);
glBindTexture(GL_TEXTURE_2D, texture_id[0]);
glActiveTexture(GL_TEXTURE0);
uniform_texture = glGetUniformLocation(gProgram, "texture");
glUniform1i(uniform_texture, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 320, 240, 0, GL_RGB, GL_UNSIGNED_BYTE, framebuffer);
glEnable(GL_TEXTURE_2D);

glClearColor(grey, grey, grey, 1.0f);
checkGlError("glClearColor");
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
checkGlError("glClear");

glUseProgram(gProgram);
checkGlError("glUseProgram");

glVertexAttribPointer(gvPositionHandle, 2, GL_FLOAT, GL_FALSE, 0, vertexCoords);
checkGlError("glVertexAttribPointer");
glEnableVertexAttribArray(gvPositionHandle);
checkGlError("glEnableVertexAttribArray");
//glDrawArrays(GL_TRIANGLES, 0, 3);
checkGlError("glDrawArrays");
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: наложение текстур из буффера
СообщениеДобавлено: 05 окт 2015 12:59 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Не совсем понял как Вы назначаете текстуру:
Цитата:
Для того чтобы правильно отобразить текстуру на четырехугольник, вы должны отобразить правый верхний угол текстуры на правую верхнею вершину четырехугольника. Левый верхний угол текстуры отображается в левую верхнею вершину четырехугольника, правый нижний угол текстуры отображается в правую нижнею вершину четырехугольника, и в завершении, левый нижний угол текстуры отображается в левую нижнею вершину четырехугольника. Если углы текстуры не совпадают с углами четырехугольника, изображение может быть сдвинуто вниз, в сторону, или вообще отсутствовать.

http://pmg.org.ru/nehe/nehe06.htm

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: наложение текстур из буффера
СообщениеДобавлено: 05 окт 2015 17:58 
Не в сети
Новичок

Зарегистрирован: 03 окт 2015 21:23
Сообщения: 7
а как это сделать на андроиде, там отсутствуют команды glBegin и
glTexCoord2fи другие, нет примера для андроид?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: наложение текстур из буффера
СообщениеДобавлено: 07 окт 2015 12:39 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Сам на андроиде не програмировал. Надо искать. Можно попробывать посмотреть код от 6 урока на сайте nehe для android, может там есть.
Ну вот смотри:
http://www.jayway.com/2010/12/30/opengl ... -textures/
Здесь есть glTexCoordPointer!
На сайте pmg эта функция:
http://yandex.ru/search/?text=glTexCoor ... u&lr=11071

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: наложение текстур из буффера
СообщениеДобавлено: 12 окт 2015 22:52 
Не в сети
Новичок

Зарегистрирован: 03 окт 2015 21:23
Сообщения: 7
перешел на android studio, через native jni написал новый код на C++
отрывок из gl_code.cpp
Код:

static GLuint program;
static GLuint position;
static GLuint texcoord;

static GLuint textures[1];

GLuint loadShader(GLenum shaderType, const char* pSource) {
    GLuint shader = glCreateShader(shaderType);
    if (shader) {
        glShaderSource(shader, 1, &pSource, NULL);
        glCompileShader(shader);
        GLint compiled = 0;
        glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
        if (!compiled) {
            GLint infoLen = 0;
            glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen);
            if (infoLen) {
                char* buf = (char*) malloc(infoLen);
                if (buf) {
                    glGetShaderInfoLog(shader, infoLen, NULL, buf);
                    LOGE("Could not compile shader %d:\n%s\n",
                            shaderType, buf);
                    free(buf);
                }
                glDeleteShader(shader);
                shader = 0;
            }
        }
    }
    return shader;
}

GLuint createProgram(const char* pVertexSource, const char* pFragmentSource) {
    GLuint vertexShader = loadShader(GL_VERTEX_SHADER, pVertexSource);
    if (!vertexShader) {
        return 0;
    }

    GLuint pixelShader = loadShader(GL_FRAGMENT_SHADER, pFragmentSource);
    if (!pixelShader) {
        return 0;
    }

    GLuint program = glCreateProgram();
    if (program) {
        glAttachShader(program, vertexShader);
        checkGlError("glAttachShader");
        glAttachShader(program, pixelShader);
        checkGlError("glAttachShader");
        glLinkProgram(program);
        GLint linkStatus = GL_FALSE;
        glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
        if (linkStatus != GL_TRUE) {
            GLint bufLength = 0;
            glGetProgramiv(program, GL_INFO_LOG_LENGTH, &bufLength);
            if (bufLength) {
                char* buf = (char*) malloc(bufLength);
                if (buf) {
                    glGetProgramInfoLog(program, bufLength, NULL, buf);
                    LOGE("Could not link program:\n%s\n", buf);
                    free(buf);
                }
            }
            glDeleteProgram(program);
            program = 0;
        }
    }
    return program;
}

static const char VERTEX_SHADER[] =
   "attribute vec4 position;"
   "attribute vec2 texcoord;"
   "varying vec2 texcoordVarying;"
   "void main() {"
      "gl_Position = position;"
      "texcoordVarying = texcoord;"
   "}";


static const char FRAGMENT_SHADER[] =
   "precision mediump float;"
   "varying vec2 texcoordVarying;"
   "uniform sampler2D texture;"
   "void main() {"
      "gl_FragColor = texture2D(texture, texcoordVarying);"
   "}";


bool setupGraphics(int w, int h) {
    printGLString("Version", GL_VERSION);
    printGLString("Vendor", GL_VENDOR);
    printGLString("Renderer", GL_RENDERER);
    printGLString("Extensions", GL_EXTENSIONS);


    LOGI("setupGraphics(%d, %d)", w, h);
   program = createProgram(VERTEX_SHADER, FRAGMENT_SHADER);
   if (!program) {
      LOGE("Could not create program.");
   }
   glUseProgram(program);
   checkGlError("glUseProgram");

   

   position = glGetAttribLocation(program, "position");
   checkGlError("glGetAttribLocation position");
   glEnableVertexAttribArray(position);

   texcoord = glGetAttribLocation(program, "texcoord");
   checkGlError("glGetAttribLocation texcoord");
   glEnableVertexAttribArray(texcoord);

   textures[0] = glGetUniformLocation(program, "texture");
   checkGlError("glGetUniformLocation texture");


   unsigned int*  _pixels;// = (unsigned int*) env->GetPrimitiveArrayCritical(pixels, 0);
_pixels = (unsigned int*)malloc(2*h);
   // ARGB ? RGBA ???????
   const int size = 2*h;
   for (int i = 0; i < size; i++) {
      unsigned int px = _pixels[i];
      _pixels[i] = (
            ((px      ) & 0xFF000000) | // A
            ((px << 16) & 0x00FF0000) | // R
            ((px      ) & 0x0000FF00) | // G
            ((px >> 16) & 0x000000FF)   // B
         );
   }

   glGenTextures(1, textures);
   glBindTexture(GL_TEXTURE_2D, textures[0]);
   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, _pixels);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);   
//env->ReleasePrimitiveArrayCritical(pixels, _pixels, JNI_ABORT);
    return true;
}
static const GLfloat VERTEXS[] = {
   -1.0f,  1.0f, 0.0f,   // ??
   -1.0f, -1.0f, 0.0f,   // ??
    1.0f,  1.0f, 0.0f,   // ??
    1.0f, -1.0f, 0.0f   // ??
};


static const GLfloat TEXCOORDS[] = {
   0.0f, 0.0f,   // ??
   0.0f, 1.0f,   // ??
   1.0f, 0.0f,   // ??
   1.0f, 1.0f   // ??
};

static void updatetex()
{   
//LOG("signal");
//////////////////////////////////////
//////////////get framebuffer here
////////////////////////////////////////
           //              glGenTextures(1, textures);
//   glBindTexture(GL_TEXTURE_2D, textures[0]);
   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 320, 240, 0, GL_RGB, GL_UNSIGNED_BYTE, framebuffer);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

                                }

void renderFrame() {
/*   static float grey;
    grey += 0.01f;
    if (grey > 1.0f) {
        grey = 0.0f;
    }
    glClearColor(grey, grey, grey, 1.0f);
    checkGlError("glClearColor");
    glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
    checkGlError("glClear");*/
updatetex();
  glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
   glClear(GL_COLOR_BUFFER_BIT);

   glEnable(GL_TEXTURE_2D);
   glEnable(GL_BLEND);
   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);   

   glActiveTexture(GL_TEXTURE0);
   glBindTexture(GL_TEXTURE_2D, textures[0]);
   glUniform1i(textures[0], 0);
   glVertexAttribPointer(texcoord, 2, GL_FLOAT, false, 0, TEXCOORDS);
   glVertexAttribPointer(position, 3, GL_FLOAT, false, 0, VERTEXS);
   glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

   glDisable(GL_BLEND);
   glDisable(GL_TEXTURE_2D);
}


выводит текстуры но через некоторое время падает программа с ошибкой Heap Memory fatal 11 signal win death
В чем ошибка?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: наложение текстур из буффера
СообщениеДобавлено: 13 окт 2015 09:41 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Heap - динамическая память. Похоже, что _pixels = (unsigned int*)malloc(2*h); выполняется не однократно. Можешь проверить?

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: наложение текстур из буффера
СообщениеДобавлено: 13 окт 2015 15:04 
Не в сети
Новичок

Зарегистрирован: 03 окт 2015 21:23
Сообщения: 7
Проверил, вызывается один раз при старте.
В проекте есть еще framebuffer = (unsigned int*)malloc(320 * 240 * 4); вызывается тоже один раз при старте.


Попробовал убрать все буфера malloc и заменить на null
Код:
   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 320, 240, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);


вылетов не стало, но черный экран, не пойму что не так с буферами вроде все верно сделал :o
Подскажите как тогда быть :help:



UPDATE:
ухх вроде разобрался, буфер _pixels удалил из проекта вообще, оставил только framebuffer обновляется в Dostep(), вылетов нет!! =)

Теперь хочу подключить еще SDL 2.0 и внедрить туда gl код, будет SDL2+open gles 2, может есть примеры по этой теме?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: наложение текстур из буффера
СообщениеДобавлено: 14 окт 2015 13:11 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
SDL вообще не занимался. Но мне кажется, должно быть точно на сайте SDL, и скорее всего есть в уроках NeHe пример кода на sdl.

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: наложение текстур из буффера
СообщениеДобавлено: 14 окт 2015 17:15 
Не в сети
Новичок

Зарегистрирован: 03 окт 2015 21:23
Сообщения: 7
Перешел обратно на eclipse, подключил SDL2.0.4 для вывода звука и GLES 2 изображение, все работает :)
Есть еще вопрос по open gl, когда я программировал под вин там был параметр GL_BGR, в Gles 2 его нет(есть только GL_RGB), есть ли альтернатива или что то еще?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: наложение текстур из буффера
СообщениеДобавлено: 15 окт 2015 13:07 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Альтернативы нет. Хотя по мне особенной разницы нет, так как в принципе RedGreenBlue это тоже BlueGreenRed только чуть наоборот. По идее этот порядок должен зависеть от видеокарты.

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: наложение текстур из буффера
СообщениеДобавлено: 20 окт 2015 22:11 
Не в сети
Новичок

Зарегистрирован: 03 окт 2015 21:23
Сообщения: 7
да, с графикой все получилось отлично спасибо за помощь, теперь проблемы с open sles(звук неправильно проигрывается) и оптимизации самой программы с помощью proguard, можете помочь?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: наложение текстур из буффера
СообщениеДобавлено: 21 окт 2015 11:13 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Увы, нет, этим совсем не занимался.

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: наложение текстур из буффера
СообщениеДобавлено: 22 окт 2015 16:44 
Не в сети
Новичок

Зарегистрирован: 03 окт 2015 21:23
Сообщения: 7
Появились новые вопросы, нужно отрисоватб текстуру управления поверх основного, создал текстуру в пнг формвте rgba, обработка событий происходит в онтач, как мне наложить эту текстуру поверх остального используя альфа канал?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: наложение текстур из буффера
СообщениеДобавлено: 23 окт 2015 09:47 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Здесь есть:
http://pmg.org.ru/nehe/nehe32.htm

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB