Opengl что это андроид или

Полный список

— создаем простейший пример с OpenGL

Продолжаем тему графики, и переходим на следующий уровень, который называется OpenGL ES. Расшифровывается это как OpenGL for Embedded Systems, т.е. OpenGL для встраиваемых систем (android-девайсы в нашем случае).

Пару лет назад я читал книгу по этой теме, делал из нее примеры и, в целом, без особых проблем понял, все что там было написано. Но та книжка была по OpenGL ES версии 1.0. Cейчас эта версия уже устарела и используются версии 2.0, 3.0 и 3.1. Эти версии по API существенно отличаются от 1.0 и несовместимы с ней. Поэтому мне самому придется изучать тему почти заново.

Первый урок будет похож на Урок 141. Мы выполним минимальный набор действий, чтобы заполнить экран каким-либо цветом, но в этот раз сделаем это с помощью OpenGL. Кстати, сразу хочу предупредить, что OpenGL это не обязательно 3D. Сначала мы немного порисуем 2D, а потом добавим объем.

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

Приступим к созданию нашего первого минимального примера. Обсудим его ключевые элементы.

1) Изображение надо на чем-то показывать. Для этого мы будем использовать компонент GLSurfaceView (далее — surface).

2) Изображение кто-то должен создавать, т.е. принимать от нас инструкции, что и как рисовать. Этим будет заниматься Renderer (далее — рендер).

3) Ну и нужна будет проверка, что девайс поддерживает OpenGL 2.0, иначе ничего не будет работать.

Начнем с создания класса рендера. Объект этого рендер-класса мы потом будем передавать в surface, которое в процессе своей работы будет вызывать методы рендера.

Рендер имеет три метода:

onSurfaceCreated — вызывается при создании/пересоздании surface. Т.е. метод будет вызываться при запуске приложения или, например, в уже запущенном приложении при выходе девайса из сна. Здесь будет выполняться установка OpenGL параметров и инициализация графических объектов.

onSurfaceChanged — вызывается при изменении размера surface. Самый распространенный пример — смена ориентации экрана.

onDrawFrame — вызывается, когда surface готово отобразить очередной кадр. В этом методе мы и будем создавать изображение.

Создаем класс OpenGLRenderer, который реализует интерфейс Renderer:

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import static android.opengl.GLES20.GL_COLOR_BUFFER_BIT;
import static android.opengl.GLES20.glClear;
import static android.opengl.GLES20.glClearColor;
import static android.opengl.GLES20.glViewport;

public class OpenGLRenderer implements Renderer <

@Override
public void onDrawFrame ( GL10 arg0 ) <
glClear ( GL_COLOR_BUFFER_BIT ) ;

@Override
public void onSurfaceChanged ( GL10 arg0, int width, int height ) <
glViewport ( 0 , 0 , width, height ) ;

@Override
public void onSurfaceCreated ( GL10 arg0, EGLConfig arg1 ) <
glClearColor ( 0f , 1f , 0f , 1f ) ;
>

В onSurfaceCreated мы вызываем метод glClearColor и передаем ему RGBA-компоненты в диапазоне от 0 до 1. Тем самым мы устанавливаем дефолтный цвет, который будет отображаться после полной очистки surface.

А в методе onDrawFrame мы как раз выполняем эту очистку. Метод glClear с параметром GL_COLOR_BUFFER_BIT очистит все цвета на экране, и установит цвет, заданный методом glClearColor.

В методе onSurfaceChanged мы методом glViewPort задаем область surface, которая будет доступна для вывода изображения. Мы указываем левую нижнюю точку — (0,0) и размеры области — (width, height), т.е. изображение будет выведено на все surface.

Рендер готов. Теперь надо в Activity повесить surface и настроить его.

Читайте также:  Как сделать резервную копию андроид устройства

import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;
import android.content.pm.ConfigurationInfo;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends Activity <

private GLSurfaceView glSurfaceView;

@Override
protected void onCreate ( Bundle savedInstanceState ) <
super .onCreate ( savedInstanceState ) ;
if ( !supportES2 ()) <
Toast.makeText ( this, «OpenGl ES 2.0 is not supported» , Toast.LENGTH_LONG ) .show () ;
finish () ;
return ;
>
glSurfaceView = new GLSurfaceView ( this ) ;
glSurfaceView.setEGLContextClientVersion ( 2 ) ;
glSurfaceView.setRenderer ( new OpenGLRenderer ()) ;
setContentView ( glSurfaceView ) ;
>

@Override
protected void onPause () <
super .onPause () ;
glSurfaceView.onPause () ;
>

@Override
protected void onResume () <
super .onResume () ;
glSurfaceView.onResume () ;
>

private boolean supportES2 () <
ActivityManager activityManager =
( ActivityManager ) getSystemService ( Context.ACTIVITY_SERVICE ) ;
ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo () ;
return ( configurationInfo.reqGlEsVersion >= 0x20000 ) ;
>

В onCreate мы сначала нашим методом supportES2 определяем, что девайс поддерживает OpenGL ES 2.0 и выше. Если нет, то закрываемся.

Если же все ок, то
— создаем GLSurfaceView,
— методом setEGLContextClientVersion говорим ему, что будем использовать OpenGL ES версии 2
— методом setRenderer передаем экземпляр нашего класса OpenGLRenderer. Теперь этот рендер будет отвечать за то, что будет нарисовано на surface
— методом setContentView ставим surface как основное View для Activity

Кроме этого, необходимо привязать surface к lifecycle-методам Activity: onPause и onResume, вызвав в них одноименные surface-методы.

Все готово. Запускаем

Экран заполнен зеленым цветом. Первое простейшее OpenGL-приложение готово. Не Need For Speed конечно, но с чего то ж надо начинать )

Три момента, на которых я хотел бы еще остановиться

1) Почему-то не работает alpha-компонент в методе glClearColor. Т.е. передаете последним параметром хоть 0 хоть 1, прозрачность не добавляется. На этот вопрос у меня пока ответа нет.

2) Координаты viewport, которые мы задаем методом glViewport никак не влияют на результат, и даже если задать область viewport только в половину surface, все равно в зеленый цвет будет закрашена все surface. По этому поводу я вычитал, что это норма. Метод glClear работает на все surface, независимо от размера viewport.

3) По поводу запуска приложений. Обычно пишут, что OpenGL ES не пашет на эмуляторах. Я не проверял на стандартном эмуляторе, но на Genymotion запуcкается без проблем. На крайняк всегда есть реальный девайс, можно тестить на нем.

Присоединяйтесь к нам в Telegram:

— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование

— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме

Источник

OpenGL ES 3.0 в Android 4.3 — сжатие текстур ETC2

Совсем недавно вышла новая версия Android — 4.3. Уже задолго до его релиза были утечки сперва для Galaxy S4, а потом и Nexus 4. В этих прошивках я сразу же обнаружил библиотеки для работы с OpenGL ES 3.0, что несказанно обрадовало — слухи о том, что демонстрированные еще в марте демки OpenGL ES 3.0 на HTC One работают на родных библиотеках Android, подтвердились (равно и как слухи о поддержке Bluetooth Low Energy).

И вот в пятницу вечером пришли OTA обновления одновременно на два наших устройства — Nexus 4 и Nexus 10. На Nexus 7 обновление пока 4.3 не пришло, но это нас нисклько не огорчает (почему — объясню позже). Разумеется, руки зачесались это добро опробовать.

Вступление — что нового в OpenGL ES 3.0

В новой версии OpenGL ES 3.0 появился целый ряд новых возможностей, перечислять которые не стану, о них можно узнать из документации здесь: www.khronos.org/opengles/3_X
и в кратком пресс-релизе здесь: www.khronos.org/news/press/khronos-releases-opengl-es-3.0-specification
В даной статье затронем самую простую и наиболее быструю в применении возможность OpenGL ES 3.0 — новый стандартный формат сжатия текстур ETC2.

Читайте также:  Версии android от производителей

Формат сжатия ETC2 был разработан на основе ETC1 и его принцип работы основан на неиспользуемых в ETC1 последовательностях бит. Для того, чтобы понять гениальность того, как удалось расширить ETC1 до ETC2 стоит прочесть эти документы:
описание алгоритма сжатия: www.jacobstrom.com/publications/StromPetterssonGH07.pdf
и описание формата ETC2: www.graphicshardware.org/previous/www_2007/presentations/strom-etc2-gh07.pdf

ETC2, так же как и ETC1, работает с блоками 4х4 пикселя, но для каждого блока подбирается определенный алгоритм сжатия — обычный ETC1 или один из трех дополнительных алгоритмов.

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

Вот пример сжатия различных изображений из документов:

Инициализация OpenGL ES 3.0

Для инициализации OpenGL ES 3.0 в Android 4.3 не требуется никаких дополнительных манипуляций. Следует создать обычный контекст OpenGL ES 2.0. Если GPU поддерживает OpenGL ES 3.0, то Android автоматически создаст контекст OpenGL ES 3.0, который полностью обратно совместим с OpenGL ES 2.0. То есть на Android 4.3 все приложения, использующие OpenGL ES 2.0, фактически работают с OpenGL ES 3.0. Для того, чтобы удостовериться что полученый контекст — 3.0, следует проверить строку GL_VERSION. Пример кода из исходников Android 4.3: android.googlesource.com/platform/frameworks/base/+/android-4.3_r0.9/libs/hwui/Extensions.cpp
Спасибо Romain Guy за это и другие объяснения об использовании OpenGL ES 3.0 в день релиза 4.3: plus.google.com/u/0/+RomainGuy/posts/iJmTjpUfR5E

Пример Java кода:

nVidia

Тут пожалуй, есть смысл объяснить, почему нам неважна задержка обновления Nexus 7 до Android 4.3. Дело в том, что чипы nVidia Tegra 2/3 не поддерживают OpenGL ES 3.0. К сожалению, даже Tegra 4 его не поддерживает. nVidia просто продолжает запихивать свои десктопные решения в мобильные чипы, и их маркетинговый отдел это отстающее от жизни решение успешно проталкивает. Чего только стоит весьма нелепое оправдание этого в Tegra 4 Whitepaper, страница 11: www.nvidia.com/docs/IO/116757/Tegra_4_GPU_Whitepaper_FINALv2.pdf Они признают, что чип не поддерживает полную спецификацию ES 3.0, и открыто говорят что все равно “мы не ожидаем, что в скором времени приложения/игры будут использовать ES 3.0”. Сюрприз — Android 4.3 сам использует OpenGL ES 3.0.

Хотя при том что nVidia совершенно не собирается расширять текущие чипы для поддержки ES 3.0, Tegra 5 все же уже будет его поддерживать: www.ubergizmo.com/2013/07/nvidia-tegra-5-release-date-specs-news

Создание сжатых текстур

Для создания ETC2-текстур использовался инмтрумент Mali Texture Compression Tool: malideveloper.arm.com/develop-for-mali/mali-gpu-texture-compression-tool. Для получения наилучшего качества тексур использовался метод сжатия “Slow” и Error Metric “Perceptual”.

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

При сжатии текстуры в ETC1 заметны артефакты в виде горизонтальных (особенно хорошо видны) и вертикальных полос. При сжатии ETC2 эти артефакты практически отсутствуют.
В наших живых обоях на участках сцен, для которых качество текстуры критично, используются текстуры без сжатия. Как видно на сравнительном изображении, ETC1 вносит наиболее заметные искажения в текстуры с плавными градиентами — становятся четко видны артефакты сжатия, вызванные особенностью сжатия квадратами размером 4х4 пикселя. Поэтому для неба применяем текстуры без сжатия, а они занимают довольно много места — ведь их размер 2048х512. Сжатие в формате PVRTC также дает достаточно хорошее качество текстур, но доступно только на чипах PowerVR. Применение стандартного для ES 3.0 формата ETC2 позволило достичь приемлемого качества текстуры при сокращении объема выделенной для текстуры видеопамяти в 4 раза:
Для текстуры 2048х512:
Несжатая (16-битный цвет 565 — 2 байта на пиксель): 2*2048*512 = 2097152 // 2 МБ данных
Сжатая (16 байт — заголовок PKM): 524304-16 = 524288 // 512 кБ данных.

Читайте также:  Samsung galaxy a30 прошивка android 10

Загрузка ETC2 текстуры

Текстура загружается из файла .pkm. Такой же формат используется для хранения текстур ETC1. Формат заголовка описан здесь: forums.arm.com/index.php?/topic/15835-pkm-header-format

Решил не пытаться загружать ETC2 текстуры с помощью ETC1Util, так как в нем есть валидация заголовка.
Код для загрузки текстуры:

Таким образом, при наличии контекста ES 3.0 будет загружаться текстура ETC2, а в режиме ES 2.0 — обычная несжатая текстура.

Разумеется, для доступа к классу GLES30 нужно задать android:targetSdkVersion=«18» в манифесте приложения и target=android-18 в project.properties.

Результат

В приложении разница между несжатой текстурой (без искажений) и ETC2 не заметна:


Приложение доступно по ссылке: play.google.com/store/apps/details?id=org.androidworks.livewallpapercarfree

Заключение

Мы всегда стараемся использовать новые возможности каждой новой версии Android для оптимизации производительности и расширения возможностей. В частности, обои поддерживают и работу в режиме заставки — daydream. Хоть статейка получилась и недостаточно объемная, но надеюсь что наш скромный опыт в использовании ETC2 может кому-нибудь пригодится для оптимизации своих приложений.

Источник

OpenGL в смартфонах — что это и зачем нужно?

Принцип работы и применение технологии OpenGL ES 2.0.

Сейчас трехмерные изображения стали привычными. Чаще всего они встречаются в фильмах со специальными эффектами, компьютерных и мобильных играх. На заре становления компьютерной графики не существовало единого стандарта, и все программы создавались практически «с нуля», на основе своих методов отображения графической информации.

Позже, когда трехмерная графика стала доступной не только для суперокомпьютеров, но и для обычных ПК, появилась насущная потребность в едином стандарте в области графики. Одним из них и стал OpenGL (Open Graphics Library — «открытая графическая библиотека»). На сегодня это один из самых популярных графических стандартов в мире.

OpenGL основан на графической библиотеке IRIS GL, созданной компанией Silicon Graphics. Стандарт был разработан и утвержден в 1992 году целой группой крупнейших разработчиков, в число которых вошли Silicon Graphics, IBM Corporation, Microsoft, Hewlett-Packard Corporation, Sun Microsystems, Intel Corporation, Evans & Sutherland и другие.

Технология OpenGL в телефонах

OpenGL — спецификация, благодаря которой мобильные устройства получили возможность отображать графику уровня игровых приставок. Стандарт включает более 300 функций для отрисовки сложных трехмерных сцен. Он относится к открытым спецификациям, что позволяет написанные с его помощью программы портировать на любые платформы. При этом результат будет одинаковым, будь это мощный профессиональный компьютер или обычный смартфон.

OpenGL позволяет получить на смартфоне более быструю и плавную работу интерфейса, а также высокую производительностью в 3D-приложениях, в том числе и в играх. В современных смартфонах используется версия OpenGL ES 2.0.

Данную опцию можно включить на мобильном устройстве через режим разработчика. Для этого нужно войти в «Настройках» в раздел «О телефоне» и 7 раз подряд нажать по надписи с версией операционной системы или по версии сборки (в зависимости от производителя). Далее нужно найти в разделе «Для разработчиков» опцию 4X MSAA. Если ее включить, активируется четырехкратное сглаживание в технологии OpenGL ES 2.0. Это улучшит качество графики на смартфоне, но приведет к более быстрой разрядке аккумулятора.

Стандарт OpenGLв смартфонах позволяет значительно повышать качество графики в приложениях и играх. Минус этой спецификации — высокая нагрузка на системные ресурсы и батарею устройства.

Источник

Оцените статью