Il n’y a que Miku

Le résultat du travail sur la bibliothèque FSGL avec OpenGL ES et le code :

Ensuite, je décrirai comment tout a été programmé, divers problèmes intéressants ont été résolus.

Tout d’abord, nous allons initialiser le contexte OpenGL ES, comme je l’ai écrit dans le post précédent. De plus, nous ne considérerons que le rendu et une brève description du code.

La Matrix vous surveille

Cette figure de Miku dans la vidéo est constituée de triangles. Pour dessiner un triangle dans OpenGL, vous devez spécifier trois points avec les coordonnées x, y, z. en coordonnées 2D du contexte OpenGL.
Puisque nous devons dessiner une figure contenant des coordonnées 3D, nous devons utiliser une matrice de projection. Nous devons également faire pivoter, zoomer ou faire tout ce que nous voulons faire avec le modèle. À cette fin, la matrice de modèle est utilisée. Il n’y a pas de concept de caméra dans OpenGL ; en fait, les objets tournent autour d’une caméra statique. Pour cela, une matrice de vues est utilisée.

Pour simplifier la mise en œuvre d’OpenGL ES – il ne contient pas de données matricielles. Vous pouvez utiliser des bibliothèques qui ajoutent des fonctionnalités manquantes, par exemple GLM.

Shaders

Afin de permettre au développeur de dessiner n’importe quoi, et de quelque manière que ce soit, OpenGL ES doit implémenter des vertex et fragment shaders. Le vertex shader doit recevoir les coordonnées de rendu en entrée, effectuer des transformations à l’aide de matrices et transmettre les coordonnées à gl_Position. Fragment ou pixel shader – dessine déjà la couleur/texture, applique une superposition, etc.

J’ai écrit des shaders en GLSL. Dans mon implémentation actuelle, les shaders sont intégrés directement dans le code de l’application principale sous forme de chaînes C.

Tampons

Le vertex buffer contient les coordonnées des sommets (vertices) ; ce tampon contient également les coordonnées pour la texturation et d’autres données nécessaires aux shaders. Après avoir généré le vertex buffer, vous devez lier le pointeur aux données du vertex shader. Cela se fait avec la commande glVertexAttribPointer, où vous devez spécifier le nombre d’éléments, un pointeur vers le début des données et la taille du pas qui sera utilisé pour parcourir le tampon. Dans mon implémentation, la liaison des coordonnées de sommet et des coordonnées de texture pour le pixel shader est effectuée. Cependant, il convient de dire que le transfert des données (coordonnées de texture) vers le fragment shader s’effectue via le vertex shader. Pour y parvenir, les coordonnées sont déclarées en utilisant variant.

Pour qu’OpenGL sache dans quel ordre dessiner les points des triangles – vous aurez besoin d’un tampon d’index (index). Le tampon d’index contient le numéro de sommet dans le tableau ; en utilisant trois de ces indices, un triangle est obtenu.

Textures

Vous devez d’abord charger/générer une texture pour OpenGL. Pour cela j’ai utilisé SDL_LoadBMP, la texture est chargée depuis un fichier bmp. Cependant, il convient de noter que seuls les BMP 24 bits conviennent et que les couleurs qu’ils contiennent ne sont pas stockées dans l’ordre RVB habituel, mais en BGR. Autrement dit, après le chargement, vous devez remplacer le canal rouge par un bleu.
Les coordonnées de texture sont spécifiées au format UV< /a>, c’est-à-dire qu’il vous suffit de transférer deux coordonnées. La sortie de texture est effectuée dans le fragment shader. Pour ce faire, vous devez lier la texture dans un fragment shader.

Rien de plus

Puisque, selon nos instructions, OpenGL dessine de la 3D à la 2D – puis pour implémenter la profondeur et sélectionner des triangles invisibles – vous devez utiliser l’élimination et un tampon de profondeur (Z-Buffer). Dans mon implémentation, j’ai réussi à éviter la génération manuelle du tampon de profondeur à l’aide de deux commandes : glEnable(GL_DEPTH_TEST); et sélections glEnable(GL_CULL_FACE);
Assurez-vous également de vérifier que le plan proche de la matrice de projection est supérieur à zéro, car vérifier la profondeur avec un plan proche nul ne fonctionnera pas.

Rendu

Pour remplir le tampon de vertex, le tampon d’index avec quelque chose de conscient, par exemple le modèle Miku, vous devez charger ce modèle. Pour cela, j’ai utilisé la bibliothèque assimp. Miku a été placé dans un fichier au format Wavefront OBJ, chargé à l’aide de assimp, et la conversion des données d’assimp en tampons de sommets et d’index a été implémentée.

Le rendu s’effectue en plusieurs étapes :

  1. Faire pivoter Miku à l’aide de la rotation de la matrice du modèle
  2. Effacer l’écran et le tampon de profondeur
  3. Dessiner des triangles à l’aide de la commande glDrawElements.

Prochaine étape – Implémentation du rendu en WebGL à l’aide d’Emscripten.

Code source :
https://github.com/demensdeum/OpenGLES3-Experiments/tree/master/8-sdl-gles-obj-textured-assimp-miku
Modèle :
https://sketchfab.com/models/7310aaeb8370428e966bdcff414273e7

 

Projetez-le

Après avoir dessiné une théière rouge en 3D, je considère qu’il est de mon devoir de décrire brièvement comment cela se fait.

L’OpenGL moderne ne dessine pas en 3D, il dessine uniquement des triangles, des points, etc. en coordonnées d’écran 2D.
Pour générer au moins quelque chose en utilisant OpenGL, vous devez fournir un vertex buffer, écrire un vertex shader, ajouter toutes les matrices nécessaires (projection, modèle, vue) au vertex shader,associer toutes les données d’entrée à le shader, appelez la méthode de rendu en OpenGL. Est-ce que ça a l’air simple ?


Ok, qu’est-ce qu’un vertex buffer ? Liste des coordonnées à tracer (x, y, z)
Le vertex shader indique au GPU quelles coordonnées dessiner.
Le pixel shader indique quoi dessiner (couleur, texture, mélange, etc.)
Les matrices traduisent les coordonnées 3D en coordonnées OpenGL 2D qu’elles peuvent restituer

Dans les articles suivants, je fournirai des exemples de code et des résultats.

SDL2 – OpenGL ES

I love Panda3D game engine. But right now this engine is very hard to compile and debug on Microsoft Windows operation system. So as I said some time ago, I begin to develop my own graphics library. Right now it’s based on OpenGL ES and SDL2.
In this article I am going to tell how to initialize OpenGL ES context and how SDL2 helps in this task. We are going to show nothing.

King Nothing

First of all you need to install OpenGL ES3 – GLES 3 libraries. This operation is platform dependant, for Ubuntu Linux you can just type sudo apt-get install libgles2-mesa-dev. To work with OpenGL you need to initialize OpenGL context. There is many ways to do that, by using one of libraries – SDL2, GLFW, GLFM etc. Actually there is no one right way to initialize OpenGL context, but I chose SDL2 because it’s cross-platform solution, code will look same for Windows/*nix/HTML5/iOS/Android/etc.

To install sdl2 on Ubuntu use this command sudo apt-get install libsdl2-dev

So here is OpenGL context initialization code with SDL2:

    SDL_Window *window = SDL_CreateWindow(
            "SDL2 - OGLES",
            SDL_WINDOWPOS_UNDEFINED,
            SDL_WINDOWPOS_UNDEFINED,
            640,
            480,
            SDL_WINDOW_OPENGL
            );
	    

    SDL_GLContext glContext = SDL_GL_CreateContext(window);

After that, you can use any OpenGL calls in that context.

Here is example code for this article:
https://github.com/demensdeum/OpenGLES3-Experiments/tree/master/3sdl-gles
https://github.com/demensdeum/OpenGLES3-Experiments/blob/master/3sdl-gles/sdlgles.cpp

You can build and test it with command cmake . && make && ./SDLGles

Russian Quantum Hack and Number Generator

[Translation may be, some day]

Эта заметка увеличит длину вашего резюме на 5 см!

Без лишних слов о крутости квантовых компьютеров и всего такого, сегодня я покажу как сделать генератор чисел на реальном квантовом процессоре IBM.
Для этого мы будем использовать всего один кубит, фреймворк для разработки квантового ПО для python – ProjectQ, и 16 кубитовый процессор от IBM, онлайн доступ к которому открыт любому желающему по программе IBM Quantum Experience.

Установка ProjectQ

Для начала у вас должен быть Linux, Python и pip. Какие либо инструкции по установке этих базовых вещей приводить бесполезно, т.к. в любом случае инструкции устареют через неделю, поэтому просто найдите гайд по установке на официальном сайте. Далее устанавливаем ProjectQ, гайд по установке приведен в документации. На данный момент все свелось к установке пакета ProjectQ через pip, одной командой: python -m pip install –user projectq

Ставим кубит в суперпозицию

Создаем файл quantumNumberGenerator.py и берем пример генератора бинарного числа из документации ProjectQ, просто добавляем в него цикл на 32 шага, собираем бинарную строку и переводим в 32-битное число:

import projectq.setups.ibm
from projectq.ops import H, Measure
from projectq import MainEngine
from projectq.backends import IBMBackend

binaryString = ""

eng = MainEngine()

for i in range(1, 33):

 qubit = eng.allocate_qubit()

 H | qubit

 Measure | qubit

 eng.flush()

 binaryString = binaryString + str(int(qubit))

 print("Step " + str(i))

number = int(binaryString, 2)

print("\n--- Quantum 32-Bit Number Generator by demensdeum@gmail.com (2017) ---\n")
print("Binary: " + binaryString)
print("Number: " + str(number))
print("\n---")

Запускаем и получаем число из квантового симулятора с помощью команды python quantumNumberGenerator.py

Незнаю как вы, но я получил вывод и число 3974719468:

--- Quantum 32-Bit Number Generator by demensdeum@gmail.com (2017) ---

Binary: 11101100111010010110011111101100
Number: 3974719468

---

Хорошо, теперь мы запустим наш генератор на реальном квантовом процессоре IBM.

Хакаем IBM

Проходим регистрацию на сайте IBM Quantum Experience, подтверждаем email, в итоге должен остаться email и пароль для доступа.
Далее включаем айбиэмовский движок, меняем строку eng = MainEngine() -> eng = MainEngine(IBMBackend())
В теории после этого вы запускаете код снова и теперь он работает на реальном квантовом процессоре, используя один кубит. Однако после запуска вам придется 32 раза набрать свой email и пароль при каждой аллокации реального кубита. Обойти это можно прописав свой email и пароль прямо в библиотеки ProjectQ.

Заходим в папку где лежит фреймворк ProjectQ, ищем файл с помощью grep по строке IBM QE user (e-mail).
В итоге я исправил строки в файле projectq/backends/_ibm/_ibm_http_client.py:

email = input_fun('IBM QE user (e-mail) > ') -> email = "quantumPsycho@aport.ru"

password = getpass.getpass(prompt='IBM QE password > ') -> password = "ilovequbitsandicannotlie"

Напишите свой email и password со-но.

После этого IBM будет отправлять результаты работы с кубитом онлайн прямо в ваш скрипт, процесс генерации занимает около 20 секунд.

Возможно в дальнейшем я доберусь до работы квантового регистра, и возможно будет туториал, но это не обязательно.
Да прибудет с вами запутанность.

Статья на похожую тему:
Introducing the world’s first game for a quantum computer

Porting SDL C++ Game to HTML5 (Emscripten)

[Translation may be some day]

За последний год я написал простейший движок Flame Steel Engine и набор классов для игровой разработки Flame Steel Engine Game Toolkit. В данной статье я опишу как производил портирование движка и SDL игры Bad Robots на HTML 5, с использованием компилятора Emscripten.

Установка Hello World – Emscripten

Для начала нужно установить Emscripten. Простейшим вариантом оказалось использование скрипта emsdk для Linux. На официальном сайте данный тип установки называется как “Portable Emscripten SDK for Linux and OS X“. Внутри архива есть инструкция по установке с использованием скрипта. Я производил установку в директорию ~/emsdk/emsdk_portable.

После установки emscripten нужно проверить корректность работы компилятора, для этого создаем простейший hello_world.cpp и собираем его в hello_world.html с помощью команд:

source ~/emsdk/emsdk_portable/emsdk_env.sh
emcc hello_world.cpp -o hello_world.html

После компиляции в папке появится hello_world.html и вспомогательные файлы, откройте его в лучшем браузере Firefox, проверьте что все работает корректно.

Портирование кода игры

В javascript нежелательно вызывать бесконечный цикл – это приводит к зависанию браузера. На данный момент корректная стратегия – запрашивать один шаг цикла у браузера с помощью вызова window.requestAnimationFrame(callback)

В Emscripten данное обстоятельство решено с помощью вызова:

emscripten_set_main_loop(em_callback_func func, int fps, int simulate_infinite_loop);

Таким образом, нужно изменить код игры для корректного вызова метода emscripten. Для этого я сделал глобальный метод GLOBAL_fsegt_emscripten_gameLoop, в котором вызываю шаг цикла игрового контроллера. Главный игровой контроллер также вынесен в глобальную видимость:

#ifdef __EMSCRIPTEN__

void GLOBAL_fsegt_emscripten_gameLoop() {

GLOBAL_fsegt_emscripten_gameController->gameLoop();

}
#endif

Также для обработки специфических для Emscripten моментов, нужно использовать макрос __EMSCRIPTEN__.

Ресурсы и оптимизация

Emscripten поддерживает ресурсы и сборку с оптимизацией.

Для добавления изображений, музыки и прочего, положите все файлы в одну папку, например data. Далее в скрипт сборки добавьте:

emcc <файлы для сборки> –use-preload-plugins –preload-file data

Флаг –use-preload-plugins включает красивый прелоадер в углу экрана, –preload-file добавляет указанный ресурс в файл <имя проекта>.data
Код постоянно останавливался с ошибками доступа к ресурсам, пока я не включил оба этих флага. Также стоит заметить что для корректного доступа к ресурсам, желательно запускать игру на https (возможно и http) сервере, или отключить защиту локального доступа к файлам в вашем браузере.

Для включения оптимизации добавьте флаги:

-s TOTAL_MEMORY=67108864 -O3 -ffast-math

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

Производительность

Код javascript из C++ работает гораздо медленнее, даже со включенными оптимизациями. Поэтому если ваша цель это разработка для HTML5, то приготовьтесь к ручной оптимизации алгоритмов игры, паралелльному тестированию, также к написанию javascript кода вручную в особо узких местах. Для написания javascript кода используется макрос EM_ASM. Во время реализации рейкастера на emscripten, мне удалось добиться повышения fps с 2-4 до 30 с помощью прямого использования методов canvas.drawImage, в обход обертки SDL->Canvas, что почти приравнялось к написанию всего на javascript.

Поддержка SDL

На данный момент почти не работает SDL_TTF, поэтому отрисовка шрифта для Game Score в BadRobots очень проста. SDL_Image, SDL_Mixer работают корректно, в mixer я проверил только проигрывание музыки.

Исходный код Flame Steel Engine, Flame Steel Engine Game Toolkit, игры Bad Robots:

https://github.com/demensdeum/BadRobots
https://github.com/demensdeum/FlameSteelEngine
https://github.com/demensdeum/FlameSteelEngineGameToolkit

Статья на эту тему:

https://hacks.mozilla.org/2012/04/porting-me-my-shadow-to-the-web-c-to-javascriptcanvas-via-emscripten/

Tutoriel : Créer un jeu sur Android. Nous tordons la terre. Rajawali

Au commencement, Dieu a créé le ciel et la terre.

C’est la deuxième vidéo dans laquelle nous créons un jeu pour Android. Bougons la terre !
Contactez-moi si vous avez des questions ou si vous souhaitez ajouter quelque chose à ce cours.
Vidéo basée sur l’article Configuration de base et amp; Sphère (Maven) :
http://www.clintonmedbery.com/basic-rajawali3d-tutorial-for-android/

Moteur Rajawali : https://github.com/Rajawali/Rajawali

Plan, commandes, liens :
1. Installez les VirtualBox Invité Ajouts

sudo apt-get install dkmssudo apt-get install linux-headers-$(uname -r)

2. Ajouter la bibliothèque Rajawali au projet
Fichierbuild.gradle (Projet : Demon’s Cave)
Ajouter mavenCentral() < /span>vers la section buildscript/repositories
Ajoutez
maven { url< /span> “https://oss.sonatype.org/content/repositories/snapshots/” } vers la section tous les projets/dépôts

Fichier build.gradle (Module : app)
Ajoutez une compilez ‘org.rajawali3d:rajawali:1.0.306-SNAPSHOT@aar& #8217 ; vers la section dépendances

3. Créez une classe Renderer, initialisez la scène, ajoutez une sphère et faites tourner !
Code source de la classe Renderer.java :
https://github.com/clintonmedbery/RajawaliBasicProject/blob/master/app/src/main/java/com/clintonmedbery/rajawalibasicproject/Renderer.java

4. Ajoutez la classe Renderer à MainActivity
Code source MainActivity.java :
https://github.com/clintonmedbery/RajawaliBasicProject/blob/master/app/src/main/java/com/clintonmedbery/rajawalibasicproject/MainActivity.java

Texture du sol :
http://www.clintonmedbery.com/wp-content/uploads/2015/04/earthtruecolor_nasa_big.jpg

Tutoriel : Créer un jeu sur Android

‘Apprendre est lumière, et l’ignorance est obscurité

Demon’s Cave arrive bientôt sur Android.
J’ai commencé à enregistrer un cours sur le portage d’un jeu sur Android car il y a beaucoup de gens qui sont vraiment intéressés par le processus de développement.
Contactez-moi si vous avez des questions ou si vous souhaitez ajouter quelque chose à ce cours.
Vous pouvez également ajouter des sous-titres pour d’autres langues : http://www.youtube.com/ timedtext_video?ref=share&v=rx7NYkAJB2I

Plan, commandes, liens :
1. Installation de VirtualBox https://www.virtualbox.org/wiki/Downloads
2. Installation de Xubuntu http://xubuntu.org/getxubuntu/
3. Installation d’Oracle Java 7

sudo add-apt-repository ppa:webupd8team/javasudo apt-get mise à joursudo apt-get install oracle-java7-installer

4. Installer des bibliothèques 32 bits

sudo apt-get install lib32ncurses5 lib32stdc++6 zlib1g:i386

5. Installer Chrome

sudo apt-get install chromium-browser

6. Installation d’Android Studio http://developer.android.com/sdk/index.html< /p>