Глава 4. Printf в OpenGL ES

Теперь, имея 2 OpenGL ES проекта на разных платформах, можно прикинуть что в них общего и в чем разница.

Общая структура: Создание GL context-а, инициализация данных, главный цикл с покадровым rendering-ом, выход. GL команды (Слава Богу!) выглядят тоже похоже. Разница в инициализации окна и GL-a, в GL-related инклюдах (gl/egl на Android-е и glfw/glad в Windows-е). Прием и обработка системных событий и ручного ввода тоже различаются.

Значит надо собрать platform-specific вещи в 2 отдельных набора (один для PC и другой для Android-а).

Начнем с printf-обрАзной функции, которая будет нужна для разработки и потребует разных реализаций для Windows и для Android-а. Сперва на

Windows:

  1. Запускаем Visual Studio. Открываем C:\CPP\a999hello\p_windows\p_windows.sln

2. Приготовим для нее место: right-click на “p_windows ” project -> Add -> New Filter

Имя – xPlatform


3. Физически мы будем держать Windows-specific файлы в каталоге C:\CPP\p_windows (там же где и GLFW/GLAD). Надо проинформировать Проект, что искать инклюды и там тоже:

Right-click на “p_windows” project -> Properties, All configurationsWin32, Configuration properties -> C++ -> General -> Additional Include Directories -> Edit, добавляем New Line (Новую Строку), идем в

C:\CPP\p_windows

Select Folder, Ok, Apply, Ok


4. Под xPlatform добавляем header file: Right-click на xPlatform, Add -> New Item,

  • выбрать “Header File (.h)”
  • name – platform.h
  • Location неправильный, заменим на C:\CPP\p_windows

Теперь – Add.

Как и было заявлено выше, мы напишем функцию, которая сможет напечатать что-либо на экране (в данном случае – в окне Консоли), что-то типа printf-а.

Мы НЕ можем использовать сам printf потому что:

  • Он работает только на PC. На Android-е работать не будет.
  • Не работает в OpenGL экране.
  • Нужен только в Debug конфигурации, в Release должен быть отключен.

Эту функцию я назову mylog(). Хочу, чтобы она принимала параметры так же как printf (сперва форматирующая строка, и потом – по обстоятельствам).

Еще она должна отключаться в Release конфигурации. Код:

#pragma once
#include "stdio.h"
#include <stdarg.h>

inline void mylog(const char* _Format, ...) {
#ifdef _DEBUG
    va_list _ArgList;
    va_start(_ArgList, _Format);
    vprintf(_Format, _ArgList);
    va_end(_ArgList);
#endif
};

Теперь можно ее опробовать.


5. Откроем main.cpp.

Сверху, где инклюды, добавим строку:

#include "platform.h"

В функции main(void), в самом начале, сразу после “{“ добавим строку

mylog(" Hello %s !\n", "Windows");

Выбираем Debug конфигурацию (в верхнем меню).

Запускаем (зеленая стрелка). Смотрим окно Консоли:

Hello Windows !


6. Теперь можно убрать “#include <stdio.h>” из main.cpp и поменять error_callback() с использования printf на mylog (это было единственное использование printf-а в main.cpp):

static void error_callback(int error, const char* description)
{
    mylog("Error: %s\n", description);
}

Еще раз запускаем – норм.


Теперь

Android:

На Android-е это будет слегда по-другому. Во-первых – нет окна Консоли. Во-вторых – нет “окон” вообще (в Windows-овском смысле). Зато есть “LogCat” – собственный Android-овский механизм для вывода debug/development сообщений.

7. Закрываем и пере-запускаем Visual Studio, открываем C:\CPP\a999hello\p_android\p_android.sln.


8. Добавляем filter (virtual folder): right-click на p_android.NativeActivity project -> Add -> New Filter.

Имя то же, xPlatform


9. Под xPlatform создадим header file: Right-click на xPlatform, Add -> New Item,

  • выбираем “Header File (.h)”
  • name – platform.h
  • Меняем location на C:\CPP\p_android\

Затем – Add.

Код:

#pragma once
#include <android/log.h>
#include "stdio.h"

inline void mylog(const char* _Format, ...) {
#ifdef _DEBUG
    char outStr[1024];
    va_list _ArgList;
    va_start(_ArgList, _Format);
    vsprintf(outStr, _Format, _ArgList);
    __android_log_print(ANDROID_LOG_INFO, "mylog", outStr, NULL);
    va_end(_ArgList);
#endif
};

Этот код полагается на константу _DEBUG, но она пропущена в Android’s debug конфигурации.


10. Открываем p_android.NativeApplication project properties, выбираем Debug configuration, ARM64,

Идем в Configuration Properties -> C/C++ -> Preprocessor, открываем Preprocessor Definitions -> Edit. Если _DEBUG там нет, то добавить, затем OK, Apply, Ok.


11. Теперь откроем main.cpp.

В #include секции добавим новую строку:

#include "platform.h"

В функции android_main (…), в самом начале, сразу после “{“ добавим строку:

mylog(" Hello %s ! \n", "Android");


12. Опять-же, надо проинформировать p_android.NativeActivity проект где искать этот platform.h.

Right-click на p_android.NativeActivity project -> Properties, All Configurations, ARM64. Открываем Configuration Properties -> C/C++ -> General -> Additional Include Directories -> Edit, Добавляем строку, идем на

C:\CPP\p_android

Select Folder, Ok, Apply, Ok.


13. Включаем и разблокируем наш Android, подключаем к PC USB кабелем, разрешаем USB Debugging.


14. Компиляция и запуск (зеленая стрелка). На Android-е ничего нового, тот же мигающий зеленый экран, но теперь мы можем посмотреть LogCat.


15. На VS экране открываем верхнее меню -> Tools -> Android Tools -> Logcat.

В поле <Search Logcat> набираем “mylog”, Enter. И что там у нас?:

Hello Android !


Leave a Reply

Your email address will not be published. Required fields are marked *