Android OpenGles отображения изображения в текстуру
Я отрисовал изображение размером 480 * 800 в текстуру openGL, используя приведенный ниже код, который прекрасно отрисовал изображение в Samsung S3, разрешение которого 720*1280 в портретном режиме.
//initialization
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &s_texture);
glBindTexture(GL_TEXTURE_2D, s_texture);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glShadeModel(GL_FLAT);
check_gl_error("glShadeModel");
glColor4x(0x10000, 0x10000, 0x10000, 0x10000);
check_gl_error("glColor4x");
glTexImage2D(GL_TEXTURE_2D, /* target*/
0, /* level*/
GL_RGBA, /* internal format*/
480, /* width*/
800, /* height*/
0, /* border*/
GL_RGBA, /* format*/
GL_UNSIGNED_BYTE,/* type*/ //can it be GL_UNSIGNED_SHORT_5_6_5??
0); /*source pixels*/
check_gl_error("glTexImage2D");
//rendering loop
glClear(GL_COLOR_BUFFER_BIT);
glTexParameterf(GL_TEXTURE_2D,
GL_TEXTURE_WRAP_S,
GL_REPEAT);
check_gl_error("glTexParameterf:GL_TEXTURE_WRAP_S ");
glTexParameterf(GL_TEXTURE_2D,
GL_TEXTURE_WRAP_T,
GL_REPEAT);
check_gl_error("glTexParameterf:GL_TEXTURE_WRAP_T");
int rect[4] = { 0, 800, 480, -800 };
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, rect);
glTexSubImage2D(GL_TEXTURE_2D, 0,0, 0, 480, 800, GL_RGBA, GL_UNSIGNED_BYTE, s_pixels);
check_gl_error("glTexSubImage2D");
glDrawTexiOES(0, 0, 0, screen_width, screen_height); //draw into full available window
Теперь я изменил исходное изображение на размер 720 * 1280, а также цель рендеринга, которая имеет разрешение 720*1360 и является планшетом.
Теперь изменение вышеуказанного кода, как показано ниже, похоже, не работает, так как оно работает на устройстве в портретном режиме (случай выше). Изображение отображается не полностью, а частичное изображение повторяется много раз.
//initialization
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &s_texture);
glBindTexture(GL_TEXTURE_2D, s_texture);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glShadeModel(GL_FLAT);
check_gl_error("glShadeModel");
glColor4x(0x10000, 0x10000, 0x10000, 0x10000);
check_gl_error("glColor4x");
glTexImage2D(GL_TEXTURE_2D, /* target*/
0, /* level*/
GL_RGBA, /* internal format*/
720, /* width*/
1280, /* height*/
0, /* border*/
GL_RGBA, /* format*/
GL_UNSIGNED_BYTE,/* type*/ //can it be GL_UNSIGNED_SHORT_5_6_5??
/*s_pixels*/0); /*source pixels*/
check_gl_error("glTexImage2D");
//rendering loop
glClear(GL_COLOR_BUFFER_BIT);
glTexParameterf(GL_TEXTURE_2D,
GL_TEXTURE_WRAP_S,
GL_REPEAT);
check_gl_error("glTexParameterf:GL_TEXTURE_WRAP_S ");
glTexParameterf(GL_TEXTURE_2D,
GL_TEXTURE_WRAP_T,
GL_REPEAT);
check_gl_error("glTexParameterf:GL_TEXTURE_WRAP_T");
int rect[4] = { 0, 720, 1280, -720};
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, rect);
glTexSubImage2D(GL_TEXTURE_2D, 0,0, 0, 720, 1280, GL_RGBA, GL_UNSIGNED_BYTE, s_pixels);
check_gl_error("glTexSubImage2D");
glDrawTexiOES(0, 0, 0, screen_width, screen_height); //draw into full available window
1. Может кто-нибудь объяснить мне, где я ошибаюсь?
2. Может кто-нибудь объяснить мне, как справиться с рендерингом изображений с различным разрешением на дисплеях разных размеров, потому что все примеры, которые я видел, показали, что glDrawTexiOES(0, 0, 0, screen_width, screen_height);
будет делать это правильно, но это не так.
3. Если я удаляю int rect[4] = { 0, 720, 1280, -720};
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, rect);
я ничего не вижу на экране, поэтому я использую это, но я действительно не знаю цели этого и как его использовать, может кто-нибудь сказать мне, что это цель и правильное использование?
1 ответ
Ваш код выглядит правильно, но я не эксперт OpenGL. Возможно, что screen_width и screen_height не правы. В любом случае несколько советов:
- Не очень хорошая идея создавать не паузы на 2 текстуры. В некоторых устройствах это будет игнорироваться. Если вы хотите работать с изображением 780x1280, вам нужно будет создать текстуру 1024x2048. В glTexImage2D вы установите "1024,2048", а в rect и glTexSubImage вы будете использовать реальный размер изображения (780x1280).
- glDrawTexiOES (и glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES,) правы.
- Измените GL_REPEAT на GL_CLAMP_TO_EDGE, чтобы избежать повторения изображения.
Помните, что в glTexImage2D вы определяете текстуру, но изображение может быть ее частью. В glTexSubImage и GL_TEXTURE_CROP_RECT_OES вы определяете часть текстуры для рисования, а в glDrawTexiOES вы определяете прямоугольник экрана, который вы хотите нарисовать.