forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Godot (http://forum.boolean.name/forumdisplay.php?f=181)
-   -   Вопросы (http://forum.boolean.name/showthread.php?t=20848)

Arton 15.11.2020 18:57

Ответ: Вопросы
 
Цитата:

Сообщение от Arton (Сообщение 317877)
Godot 3.2.3
GLES 2.0
Android, apk релизный


Сделал простой шейдер, где смешиваются 2 текстуры, с движением UV.
На ПК работает как надо.
Однако на Андроиде, спустя минуту текстуры начинают едва заметно тормозить...

По какой бы то не было причине, главная проблема во фрагментом шейдере.

Решение для GLES 2, Android:
  1. Объявить переменную uv для каждой текстуры глобально.
  2. Анимировать UV в Vertex-шейдере.
  3. Подставить каждой текстуре свою UV в Fragment-шейдере.

Рабочий код:
PHP код:

shader_type spatial;

uniform sampler2D Texture_0 hint_albedo;
uniform sampler2D Texture_1 hint_albedo;
uniform sampler2D Texture_2 hint_albedo;

varying vec2 uv_out0;
varying vec2 uv_out1;
varying vec2 uv_out2;

void vertex() {
    
    
vec2 speed_0 vec2(0.10.5);
    
vec2 speed_1 vec2(-0.1, -0.5);
    
vec2 speed_2 vec2(-0.20.7);
    
    
uv_out0 UV TIME speed_0;
    
uv_out1 UV TIME speed_1;
    
uv_out2 UV TIME speed_2;
}

void fragment() {
        
    
vec4 Tex_0 texture(Texture_0uv_out0);
    
vec4 Tex_1 texture(Texture_1uv_out1);
    
vec4 Tex_2 texture(Texture_2uv_out2);
    
    
vec4 Color Tex_0 Tex_1 Tex_2;
    
    
ALBEDO Color.rgb;




P. S. Я уже пошёл в чатик Сканера по Годо. Советы не помогли, однако общение каким-то образом помогло заставить работать то что вчера не получилось. А именно, правильно объявить вектора глобальными :rolleyes:

P. P. S. Осталось проверить на разных устройства и словить новые баги.

Потестируйте пожалуйста:
Обычный вариант: Test_Android_2.apk
Выше точность: Test_Android_2_H.apk

Arton 17.11.2020 18:20

Ответ: Вопросы
 
Цитата:

Сообщение от ARA (Сообщение 317902)
Интересно сработает ли это:
Код:

varying flat vec2 uv_out;
varying flat vec2 uv_out2;

Вместо flat можешь попробовать
flat - The value is not interpolated
noperspective - The value is linearly interpolated in window-space
smooth - The value is interpolated in a perspective-correct fashion. This is the default

А что это такое и с чем его едят?
Мне говорят что это просто жёсткое и мягкое затенение поверности.

Оно же? (справка Годо)

ARA 17.11.2020 23:06

Ответ: Вопросы
 
Цитата:

Сообщение от Arton (Сообщение 317916)
А что это такое и с чем его едят?
Мне говорят что это просто жёсткое и мягкое затенение поверности.

Оно же? (справка Годо)

Я не знаю что это, т.к. с годотом не работаю. Если работает без этого, то прекрасно. Всё что я тебе пишу - это мои спроецированные на годот скудные знания из шейдеров в Юнити :-D Всё очень похоже.

MadMedic 18.11.2020 05:26

Ответ: Вопросы
 
как удалить объект(картинку), загруженный в коде?

Код:

var image_temp = Image.new()
image_temp.load("res://data/gui/image_temp.png")
image_temp.lock()
...
image_temp.unlock()
image_temp.free()

на строчку image_temp.free() ругается, что "Can't 'free' a reference."
Что делать и как быть?

mingw 18.11.2020 11:38

Ответ: Вопросы
 
Цитата:

Сообщение от MadMedic (Сообщение 317918)
как удалить объект(картинку), загруженный в коде?

Инфа не 100%. Но смею предположить, что ресурс удаляется вместе с родительским узлом... Возможно родительский узел является "менеджером" дочернего ресурса и если узел выкидывается из дерева, то и все дочерние ресурсы отправляются в дискард? При условии если этих ресурсов нет в других узлах.

ant0N 18.11.2020 12:42

Ответ: Вопросы
 
Цитата:

Сообщение от MadMedic (Сообщение 317918)
на строчку image_temp.free() ругается, что "Can't 'free' a reference."
Что делать и как быть?

Image - это ресурс (ссылочный тип данных), он не требует ручного удаления.
Просто занули переменную, оставь остальное сборщику мусора.

Цитата:

Unlike Objects, References keep an internal reference counter so that they are automatically released when no longer in use, and only then. References therefore do not need to be freed manually with Object.free.
https://docs.godotengine.org/en/stab...reference.html

MadMedic 19.11.2020 10:26

Ответ: Вопросы
 
Вложений: 1
я прошу прощения за занудство, но такой вариант будет верным? То есть при готовности нода картинка загрузится, а потом удалится из памяти?

Код:

func _ready():
        var image_temp = Image.new()
        image_temp.load("res://data/gui/image_temp.png")
        image_temp = null

И вопрос номер следующий. GLES2 или GLES3 ? Два режима почему то показывают разные картинки при использовании стандартного гаджета. Однако 3д вьюпорт (камера + сфера) рисует одинаковые правильные цвета. Что выбрать и на чем остановиться?

mingw 19.11.2020 21:29

Ответ: Вопросы
 
Цитата:

Сообщение от MadMedic (Сообщение 317924)
я прошу прощения за занудство, но такой вариант будет верным? То есть при готовности нода картинка загрузится, а потом удалится из памяти?

Да.
Но, скорее всего это произойдет не сразу.

Задача сборщика мусора заключается не в своевременном удалении обнуленных ресурсов, а в обеспечении достаточного количества памяти приложению. Сборщик какое-то время будет накапливать ненужные ресурсы. И обнулит их в тот момент, когда приложение запросит новую порцию памяти для создания обьектов. И вместо запроса памяти у операционной системы сборщик обнулит и отдаст приложению эти накопленые учаски памяти. Это своего рода оптимизация такая. Поэтому твой кусок кода просто сообщает сборщику мусора, что этот участок памяти больше не нужен. Реально очищен он будет когда-то в будущем.

P.S. Не знаю.. есть ли деструкторы в Godot?

GLES2 vs GLES3 - https://docs.godotengine.org/ru/stab...fferences.html

ant0N 19.11.2020 23:06

Ответ: Вопросы
 
Цитата:

Сообщение от MadMedic (Сообщение 317924)
func _ready():
var image_temp = Image.new()
image_temp.load("res://data/gui/image_temp.png")
image_temp = null

В этом случае даже не нужно занулять image_temp, т.к. это локальная переменная и она удалится при выходе из метода _ready.

Смысл в том, что ресурс обычно создаётся для использования в каком-то объекте. И этот ресурс будет жить пока живёт хотя бы один объект его использующий.
Когда умрет последний объект, тогда сборщик мусора уничтожит и бесхозный ресурс.

Цитата:

Сообщение от MadMedic (Сообщение 317924)
И вопрос номер следующий. GLES2 или GLES3 ?

Если бы был единственно верный ответ на этот вопрос, то в движке был бы только один рендер.
GLES2 более органичен, в нем нет некоторых модных фич (gpu партиклов, рилтайм GI и что-то ещё) но он менее требователен к железу и поддерживается всеми телефонами и браузерами.
То, что картинка получается разная, это нормально, нужно настраивать.

Цитата:

Сообщение от mingw (Сообщение 317926)
P.S. Не знаю.. есть ли деструкторы в Godot?

Нет. Ни в GDScript ни в C# их нет.

MadMedic 20.11.2020 03:02

Ответ: Вопросы
 
Спасибо за подробнейшие разъяснения, товарищи!

Arton 07.01.2021 22:46

Ответ: Вопросы
 
Шейдеры, в чём разница между:
1.0 и 1f?

Что это (1f) форма записи означает?

F - Float?

Andvrok 07.01.2021 22:58

Ответ: Вопросы
 
Цитата:

Сообщение от Arton (Сообщение 318258)
Шейдеры, в чём разница между:
1.0 и 1f?

Что это (1f) форма записи означает?

F - Float?

Да.
1f = 1.0
Для чисел без точки указывают суффикс, чтобы чётко отделить флоат от интеджера.

MadMedic 28.01.2021 09:45

Ответ: Вопросы
 
Продолжаю задавать нубятские вопросы. Итак есть панель, на ней 10 спрайтов. Подразумевается , что это картинки ачивок. В скрипте картинки загружаются и хранятся как Texture в массиве. Когда настает ачивка, в скрипт прилетает сигнал и скрипт меняет картинку неизвестной ачивки на активную.

При выполнении этого когда в логах я нашел следующие ворнинги:

Код:

...
**WARNING**: Loaded resource as image file, this will not work on export: 'res://media/gui/icon_achiev_0.png'. Instead, import the image file as an Image resource and load it normally as a resource.
  At: core/image.cpp:1894:load() - Loaded resource as image file, this will not work on export: 'res://media/gui/icon_achiev_0.png'. Instead, import the image file as an Image resource and load it normally as a resource.
...

Будут ли какие то проблемы при экспорте? И как это импортировать файл как "Image resource"? Что то я совсем не догоняю что он хочет

ant0N 28.01.2021 12:38

Ответ: Вопросы
 
Цитата:

Сообщение от MadMedic (Сообщение 318400)
Будут ли какие то проблемы при экспорте?

Скорее нет, чем да.

В общем, изображения это "сырые" данные и чтобы они работали везде и всегда одинаково хорошо их нужно "запечь", т.е. импортировать в родные форматы движка.
Подробнее см. здесь https://docs.godotengine.org/en/3.2/...ng_images.html

Но это странно, движок должен был автоматически это сделать. Какая у тебя версия?

MadMedic 28.01.2021 15:11

Ответ: Вопросы
 
Версия 3.2.3 штабле официале
Импортированы как текстуры, все настройки импорта были по умолчанию кроме выключенного флажка filter


Часовой пояс GMT +4, время: 14:35.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot