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)

MadMedic 03.10.2020 11:24

Вопросы
 
Первонах ! Тупой вопрос. Как завершить программу? end не работает

Randomize 03.10.2020 11:58

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

Сообщение от MadMedic (Сообщение 317661)
Как завершить программу? end не работает

PHP код:

func _notification(what):
    if 
what == MainLoop.NOTIFICATION_WM_QUIT_REQUEST:
        
get_tree().quit() # default behavior 

https://docs.godotengine.org/en/late..._requests.html

MadMedic 03.10.2020 15:59

Ответ: Вопросы
 
Благодарю!

mingw 06.10.2020 17:41

Ответ: Вопросы
 
жесть!

ant0N 06.10.2020 18:50

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

Сообщение от mingw (Сообщение 317688)
жесть!

PHP код:

public override void _Process(float delta)
{
    if (
Input.IsActionPressed("exit")
    {
        
GetTree().Quit();
    }


Так лучше?

mingw 07.10.2020 23:55

Ответ: Вопросы
 
Что это за дерево у которого вызывается метод Quit ?

ant0N 08.10.2020 00:24

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

Сообщение от mingw (Сообщение 317693)
Что это за дерево у которого вызывается метод Quit ?

Если кратко, GetTree() возвращает SceneTree, а это основной цикл (Main Loop) сцены.
Если подробно - https://docs.godotengine.org/en/stab...l#introduction

Arton 11.10.2020 10:27

Ответ: Вопросы
 
Что такое Mesh Texture?
Почитал поискал, ничего не понял.
Что это и как правильно "готовить"?

Думал могу свой меш в WorldEnvironment загрузить как небо, оказалось все не так.

Что вообще можно засунуть в стандартное небо, по мимо карты окружения?

ant0N 11.10.2020 15:29

Ответ: Вопросы
 
Вложений: 2
Цитата:

Сообщение от Arton (Сообщение 317726)
Что такое Mesh Texture?
Почитал поискал, ничего не понял.
Что это и как правильно "готовить"?

Единственное практическое применение для него которое мне известно это TextureAtlas
При создании атласа можно выбрать Mesh2D

И тогда текстуры будут храниться как Mesh2D. А для чего нужен Mesh2D, я думаю понятно.



Цитата:

Сообщение от Arton (Сообщение 317726)
Что вообще можно засунуть в стандартное небо, по мимо карты окружения?

А какую задачу ты решаешь? Что хочешь получить?

Arton 12.10.2020 00:37

Ответ: Вопросы
 
Вложений: 1
Цитата:

Сообщение от ant0N (Сообщение 317727)
Единственное практическое применение для него которое мне известно это TextureAtlas
При создании атласа можно выбрать Mesh2D

Понятно, спасибо.

Цитата:

Сообщение от ant0N (Сообщение 317727)
А какую задачу ты решаешь? Что хочешь получить?

«Небо», когда окружение локации, домики, горы вдали делают одним мешем и ставят ему ордер рендера первым.

Но с порядком рендера, в Годо проблемы.

Обычный флаг No Depth Test годится только для простой геометрии.
Всё что сложнее куба/сферы начинает просвечивать сквозь себя.


Альтернатива, использовать флаг прозрачности, у них своя сортировка.
Но с прозрачностью могут не работать некоторые эффекты.

И в добавок, в обоих случаях надо не забывать проставлять флаги каждому материалу участвующему в сцене, иначе не будет работать.

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

Но ладно, чёрт с ним с небом, не так важно, а если мне нужно в FPS что-то поверх рендерить принципиально?

Слишком заморочено.
С грустью вспоминаю Блиц, с его EntityOrder.

Ещё я читал предложения рендерить в спрайт, рендерить с поддельной глубиной... :(

P. S. Где можно достать скомпилированный Godot 4? А то я только на исходники натыкаюсь, хочу потыкать его.

P. P. S. Кстати, как полная альтернатива (только для окружения), можно всё рендерить в текстуру и натягивать на небо.
Давно видел способ для псевдо-2D персонажа, по логике тут тоже самое.

ant0N 12.10.2020 12:05

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

Сообщение от Arton (Сообщение 317728)
«Небо», когда окружение локации, домики, горы вдали делают одним мешем и ставят ему ордер рендера первым.

Как вариант можно поставить материалу флаг "Fixed Size". Вроде это то что тебе нужно.

Цитата:

Сообщение от Arton (Сообщение 317728)
С грустью вспоминаю Блиц, с его EntityOrder.

Да, прошли те времена. Игры стали сложнее, движки должны не отставать.

Цитата:

Сообщение от Arton (Сообщение 317728)
P. S. Где можно достать скомпилированный Godot 4? А то я только на исходники натыкаюсь, хочу потыкать его.

Вот "ночные сборки" от чувака, который на днях перешел в штат разработчиков годо
https://hugo.pro/projects/godot-builds/

MadMedic 16.10.2020 09:54

Ответ: Вопросы
 
Вложений: 2
Всем привет!
Делаю генератор планет,
Нужен совет.

Короче есть программно рисуемая картинка при помощи следующего кода
Код:

WorldMapImage.lock()
...
WorldMapImage.set_pixel(TileX, TileY, DrawColor)
...
WorldMapImage.unlock()

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

Рассматриваю вариант - сверху создать еще один гаждет и рисовать облака тупо поверх, но хотелось бы узнать, как рисовать картинку на картинку



pax 16.10.2020 14:25

Ответ: Вопросы
 
Если есть функция get_pixel, то можно использовать классическую функцию смешивания по альфе:

Result = CurrentColor * (1 - Alpha) + NewColor * Alpha

где CurrentColor - текущий цвет пикселя текстуры
NewColor - цвет рисуемого пикселя
Alpha - прозрачность рисуемого пикселя

Функцию применить для каждого компонента цвета ( RGB ):

ResultR = CurrentColorR * (1 - Alpha) + NewColorR * Alpha
ResultG = CurrentColorG * (1 - Alpha) + NewColorG * Alpha
ResultB = CurrentColorB * (1 - Alpha) + NewColorB * Alpha

Если смешивание идет в целых числах (0..255), то единицу заменить на 255

MadMedic 16.10.2020 17:38

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

Сообщение от pax (Сообщение 317766)
Если есть функция get_pixel, то можно использовать классическую функцию смешивания по альфе:
...

Как вариант, и очень даже неплохой для данной ситуации, да, спасибо!
Но есть наверняка элегантный способ рисовать картинками на картинках.

pax 16.10.2020 22:25

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

Сообщение от MadMedic (Сообщение 317767)
Как вариант, и очень даже неплохой для данной ситуации, да, спасибо!
Но есть наверняка элегантный способ рисовать картинками на картинках.

На любом движке наверное можно такое сделать:
1. Сделать рендертекстуру размером с исходную.
2. Сделать ее активным рендер таргетом.
3. Нарисовать полноэкранный квад с исходной текстурой с unlit шейдером. Обычно есть метод Blit или подобный.
4. Нарисовать квад с оверлей текстурой и нужным смешиванием (для этого сделать шейдер с альфаблендом или другим способом смешивания).
5. Считать пиксели рендертекстуры в исходную.

Но так как задача поставлена с примером записи пикселей в текстуру, я предложил другой метод.

mingw 24.10.2020 01:57

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

Сообщение от ant0N (Сообщение 317694)
Если кратко, GetTree() возвращает SceneTree, а это основной цикл (Main Loop) сцены.
Если подробно - https://docs.godotengine.org/en/stab...l#introduction

А если вызвать этот метод - node.Quit() - в локальном узле сцены - то, я так понимаю узел прервет распространение сигнала на дочерние узлы?

ant0N 25.10.2020 14:02

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

Сообщение от mingw (Сообщение 317792)
А если вызвать этот метод - node.Quit() - в локальном узле сцены - то, я так понимаю узел прервет распространение сигнала на дочерние узлы?

Это что за метод такой? У Node такого нет.

mingw 25.10.2020 15:31

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

Сообщение от ant0N (Сообщение 317797)
Это что за метод такой? У Node такого нет.

хмм... действительно. А как сигнал прервать то? Бывают ситуации когда не надо, что бы сигнал шел дальше по дочерним узлам.

А так глянул на этот двиг, почитал доки... ну что могу сказать... это старый, добрый Blitz3D! По крайней мере именно такое впечатление он на меня производит. Конечно, он с нормальным 2Д и ещё кучей плюшек... но простота двига подкупает. Общая архитектура тоже нравится. Я вкатился в этот двиг почти сразу. Чего не скажешь о Юнити.

ant0N 26.10.2020 09:40

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

Сообщение от mingw (Сообщение 317798)
хмм... действительно. А как сигнал прервать то? Бывают ситуации когда не надо, что бы сигнал шел дальше по дочерним узлам.

Я не очень понял что значит прервать сигнал? Какой сигнал? Что именно ты хочешь сделать?

Цитата:

Сообщение от mingw (Сообщение 317798)
А так глянул на этот двиг, почитал доки... ну что могу сказать... это старый, добрый Blitz3D!

В какой-то степени можно и так сказать.

Цитата:

Сообщение от mingw (Сообщение 317798)
Общая архитектура тоже нравится. Я вкатился в этот двиг почти сразу. Чего не скажешь о Юнити.

У меня такая же ситуация. Я уже почти год активно разрабатываю на юнити на работе, но все ещё для меня это как поедание кактуса.

Arton 10.11.2020 22:54

Ответ: Вопросы
 
Вложений: 1
Godot 3.2.3
GLES 2.0
Android, apk релизный


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



Проблема замечена на Huawei P8 Lite и P10, но по всей видимости дело не в аппаратах.
Двигать UV пробовал по разному. Разница только в скорости движения, чем быстрее движется, тем скорее начинаются рывки.

В чём может быть дело, как решить?

Навсякий случай, генерируемый VisualShaders код:
Код:

shader_type spatial;
render_mode specular_schlick_ggx, depth_test_disable, unshaded, vertex_lighting;

uniform sampler2D Texture : hint_albedo;
uniform sampler2D Texture2 : hint_albedo;



void vertex() {
// Output:0

}

void fragment() {
// Input:5
        vec3 n_out5p0 = vec3(UV, 0.0);

// Input:8
        float n_out8p0 = TIME;

// VectorMix:17
        vec3 n_in17p2 = vec3(0.03000, -0.02000, 0.00000);
        vec3 n_out17p0 = mix(n_out5p0, vec3(n_out8p0), n_in17p2);

// TextureUniform:2
        vec3 n_out2p0;
        float n_out2p1;
        {
                vec4 n_tex_read = texture(Texture, n_out17p0.xy);
                n_out2p0 = n_tex_read.rgb;
                n_out2p1 = n_tex_read.a;
        }

// VectorMix:18
        vec3 n_in18p2 = vec3(-0.03000, 0.02000, 0.00000);
        vec3 n_out18p0 = mix(n_out5p0, vec3(n_out8p0), n_in18p2);

// TextureUniform:3
        vec3 n_out3p0;
        float n_out3p1;
        {
                vec4 n_tex_read = texture(Texture2, n_out18p0.xy);
                n_out3p0 = n_tex_read.rgb;
                n_out3p1 = n_tex_read.a;
        }

// VectorOp:16
        vec3 n_out16p0 = n_out2p0 + n_out3p0;

// Output:0
        ALBEDO = n_out16p0;

}

void light() {
// Output:0

}




Второй вопрос, что бы не ходить дважды.

Тоже шейдер с расчётом на телефон, смешиваются 2 текстуры по Vertex-маске через VectorMix.
Почему же этот шейдер на единственной такой поверхности, в 35 треугольников отнимает ~10 FPS?
Неужели это настолько тяжёлая операция для смартфона?

ARA 11.11.2020 07:17

Ответ: Вопросы
 
1: Двигать текстуру с определенной скоростью:
uv = UV + Time * Speed

2: Смешивать текстуры попробуй функцией:
mix (текстура1, текстура2, красныйканалвершин)

Arton 11.11.2020 10:22

Ответ: Вопросы
 
Вложений: 2
Цитата:

Сообщение от ARA (Сообщение 317879)
1: Двигать текстуру с определенной скоростью:
uv = UV + Time * Speed

2: Смешивать текстуры попробуй функцией:
mix (текстура1, текстура2, красныйканалвершин)

1) Не работает.

2) Канал вершин, не UV? Ты уверен? У меня вершины не раскрашены, текстуры не смешиваются.
UV попробовал, не работает.

Стоп, ты про другое?
А как я по твоему их смешиваю? :crazy:


Ну, разве что ScalarMix попробовать :mda:
Вложение 23253

P. S. Похоже ScalarMix действительно меньше влияет на производительность чем Mix, спасибо что напомнил :super:
Текстуры на «сфере» по прежнему дёргаются. Втыкал туда R с UV через ScalarMix.

ARA 11.11.2020 18:22

Ответ: Вопросы
 
>> 1) Не работает.
uv = UV + 0.5
Это сдвигает текстуру (без динамики)?

MadMedic 12.11.2020 04:35

Ответ: Вопросы
 
Может float UV обнулять? У него же чем больше число - тем меньше точность

Arton 13.11.2020 18:35

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

Сообщение от ARA (Сообщение 317882)
>> 1) Не работает.
uv = UV + 0.5
Это сдвигает текстуру (без динамики)?

Да

Цитата:

Сообщение от MadMedic (Сообщение 317883)
Может float UV обнулять? У него же чем больше число - тем меньше точность

Это была моя первая мысль, но я её отмёл.

Сегодня узнал что это проблема GLES2, особенно на мобильниках.
В Годо можно повысить точность в настройках проекта (или вручную в шейдере).
Но я почему-то не увидел разницу.

Анимировать UV во фрагментом шейдере настоятельно не рекомендуется.
Предлагается смещать только в вертексном шейдере.
  1. Тут проблема как смешивать и двигать больше двух текстур.
    Потому что других вариантов кроме UV и UV2 я не знаю.
  2. И опять нет изменений. Возможно что-то упустил запутавшись, но вряд ли.
По этому вопрос:
Обнулять UV и вращать дальше, как это сделать во фрагментом шейдере?
Для GLES2 - Andorid такое не запрещено?

ARA 13.11.2020 18:54

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

Да
Хм, ну тогда и с +Time проблем не должно быть. Он точно циферку корректно возвращает?

Цитата:

Тут проблема как смешивать и двигать больше двух текстур.
Потому что других вариантов кроме UV и UV2 я не знаю.
Ты можешь двигать с помощью одного UV хоть 10 текстур. Просто тебе надо создать 10 переменных, чтоб задавать скорость для каждой конкретной текстуры. Это будет выглядеть так:

float2 uv1 = UV + Time * SpeedTexture1;
float2 uv2 = UV + Time * SpeedTexture2;
float2 uv3 = UV + Time * SpeedTexture3;
etc

uv1, uv2, uv3 уже подставляешь в tex2D:

float3 Texture1 = tex2D(_Texture1 , uv1 );
float3 Texture2 = tex2D(_Texture2 , uv2 );
float3 Texture3 = tex2D(_Texture3 , uv3 );
etc

Nex 14.11.2020 08:16

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

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


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



Проблема замечена на Huawei P8 Lite и P10, но по всей видимости дело не в аппаратах.
Двигать UV пробовал по разному. Разница только в скорости движения, чем быстрее движется, тем скорее начинаются рывки.

В чём может быть дело, как решить?

Навсякий случай, генерируемый VisualShaders код:
Код:

shader_type spatial;
render_mode specular_schlick_ggx, depth_test_disable, unshaded, vertex_lighting;

uniform sampler2D Texture : hint_albedo;
uniform sampler2D Texture2 : hint_albedo;



void vertex() {
// Output:0

}

void fragment() {
// Input:5
        vec3 n_out5p0 = vec3(UV, 0.0);

// Input:8
        float n_out8p0 = TIME;

// VectorMix:17
        vec3 n_in17p2 = vec3(0.03000, -0.02000, 0.00000);
        vec3 n_out17p0 = mix(n_out5p0, vec3(n_out8p0), n_in17p2);

// TextureUniform:2
        vec3 n_out2p0;
        float n_out2p1;
        {
                vec4 n_tex_read = texture(Texture, n_out17p0.xy);
                n_out2p0 = n_tex_read.rgb;
                n_out2p1 = n_tex_read.a;
        }

// VectorMix:18
        vec3 n_in18p2 = vec3(-0.03000, 0.02000, 0.00000);
        vec3 n_out18p0 = mix(n_out5p0, vec3(n_out8p0), n_in18p2);

// TextureUniform:3
        vec3 n_out3p0;
        float n_out3p1;
        {
                vec4 n_tex_read = texture(Texture2, n_out18p0.xy);
                n_out3p0 = n_tex_read.rgb;
                n_out3p1 = n_tex_read.a;
        }

// VectorOp:16
        vec3 n_out16p0 = n_out2p0 + n_out3p0;

// Output:0
        ALBEDO = n_out16p0;

}

void light() {
// Output:0

}




Второй вопрос, что бы не ходить дважды.

Тоже шейдер с расчётом на телефон, смешиваются 2 текстуры по Vertex-маске через VectorMix.
Почему же этот шейдер на единственной такой поверхности, в 35 треугольников отнимает ~10 FPS?
Неужели это настолько тяжёлая операция для смартфона?

В годоте gles 2 вообще лучше не трогать.

А именно с UV там примитивный баг на подуставших мобилках, который тупо не чинят.
https://github.com/godotengine/godot/issues/37935
Кстати возможно ты нашел еще один баг :crazy:

Еще на gles 2 vertex color рисует не те цвета и тоже все вкурсе, но никто не чинит.

Tiranas 14.11.2020 11:54

Ответ: Вопросы
 
Любимы дуалист Антона нарисовался, теперь опишем все баги Unity :)))

Arton 15.11.2020 14:45

Ответ: Вопросы
 
Вложений: 1
Цитата:

Сообщение от ARA (Сообщение 317886)
Хм, ну тогда и с +Time проблем не должно быть. Он точно циферку корректно возвращает?

Они есть на смартфоне, GLES 2, при смещение UV с течением времени во фрагментном шейдере.
В вершинном шейдере проблем нет.

Никакое принудительно выставление точности не работает.
В фрагментах тупо нельзя анимировать UV — деградируют.
Спустя ~3 минуты:
Вложение 23254



Цитата:

Сообщение от ARA (Сообщение 317886)
Ты можешь двигать с помощью одного UV хоть 10 текстур. Просто тебе надо создать 10 переменных, чтоб задавать скорость для каждой конкретной текстуры.

Перехожу на код вместо нодов, так оно и есть.
Однако вопрос, а если двигать в вершинном, то как тогда «анимировать 10 текстур»?

Я их просто в UV и UV2 втыкаю:
PHP код:

shader_type spatial;
render_mode unshaded;

uniform sampler2D Texture_0 hint_albedo;
uniform sampler2D Texture_1 hint_albedo;

void vertex() {
    
    
vec2 speed_0 vec2(0.10.02);
    
vec2 speed_1 vec2(-0.1, -0.02);
    
    
vec2 uv_0 TIME speed_0;
    
vec2 uv_1 TIME speed_1;
    
    
vec2 uv_out UV uv_0;
    
vec2 uv_out2 UV uv_1;
    
    
UV uv_out.xy;
    
UV2 uv_out2.xy;
}

void fragment() {
        
    
vec4 Tex_0 texture(Texture_0UV);
    
vec4 Tex_1 texture(Texture_1UV2);
    
    
vec4 Color Tex_0 Tex_1;
    
    
ALBEDO Color.rgb;




Цитата:

Сообщение от Nex (Сообщение 317888)
Еще на gles 2 vertex color рисует не те цвета и тоже все вкурсе, но никто не чинит.

Не заметил такой проблемы. Это происходит на разном железе?

Цитата:

Сообщение от Nex (Сообщение 317888)
Кстати возможно ты нашел еще один баг

Ты точно моё сообщение читал?
По твоей ссылке баг на конкретном устройстве.

ARA 15.11.2020 18:21

Ответ: Вопросы
 
Интересно сработает ли это:

Код:

shader_type spatial;
render_mode unshaded;

uniform sampler2D Texture_0 : hint_albedo;
uniform sampler2D Texture_1 : hint_albedo;
varying flat vec2 uv_out;
varying flat vec2 uv_out2;

void vertex() {
   
    vec2 speed_0 = vec2(0.1, 0.02);
    vec2 speed_1 = vec2(-0.1, -0.02);
   
    vec2 uv_0 = TIME * speed_0;
    vec2 uv_1 = TIME * speed_1;
   
    uv_out = UV + uv_0;
    uv_out2 = UV + uv_1;
   
}

void fragment() {
       
    vec4 Tex_0 = texture(Texture_0, uv_out);
    vec4 Tex_1 = texture(Texture_1, uv_out2);
   
    vec4 Color = Tex_0 + Tex_1;
   
    ALBEDO = Color.rgb;
}

Вместо 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

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

Arton 28.01.2021 18:08

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

Сообщение от MadMedic (Сообщение 318406)
Импортированы как текстуры, все настройки импорта были по умолчанию кроме выключенного флажка filter

Погоди, если у тебя для 2D интерфейса то нужно выбрать Image.
По идеи.

Нет.

ant0N, где почитать про режимы импорта?
Почему если я Texture меняю на Image или TextureAtlas редактор обязательно перезапускается?
...
Так, TextureAtlas вроде позволяет несколько изображений в одно объединить, ладно.

Цитата:

Сообщение от ant0N (Сообщение 318404)
В общем, изображения это "сырые" данные и чтобы они работали везде и всегда одинаково хорошо их нужно "запечь", т.е. импортировать в родные форматы движка.

Ты имеешь ввиду настройки импорта, а не пересохранение в .tex?
Потому что в последнем не вижу смысла (пригодилось для mip-map), в первом же копии импорта создаются автоматически.

P. S. Термин «запечь» в данном случае неуместен.

P. P. S.
Цитата:

Сообщение от Arton (Сообщение 318407)
Ты имеешь ввиду настройки импорта, а не пересохранение в .tex?
Потому что в последнем не вижу смысла (пригодилось для mip-map)

Ошибся, в этом есть смысл. Не будет копии в папке import, т. к. файл уже готов для движка.
По идеи относиться ко всем ресурсам окромя сцен и кода.

ant0N 31.01.2021 18:30

Ответ: Вопросы
 
Сорян что так долго, работал
воевал с юнити


Цитата:

Сообщение от Arton (Сообщение 318408)
ant0N, где почитать про режимы импорта?
Почему если я Texture меняю на Image или TextureAtlas редактор обязательно перезапускается?

В доках, прям в поиск вбивай то что нужно найти, там достаточно информации.
Например: Texture, Image
То, что редактор перезапускается, это нормально для некоторых ресурсов. Видимо необходимо для реимпорта, думаю со временем это исправят.

Цитата:

Сообщение от MadMedic (Сообщение 318406)
Версия 3.2.3 штабле официале
Импортированы как текстуры, все настройки импорта были по умолчанию кроме выключенного флажка filter

Нажми на проблемное изображение и покажи что у тебя в окне импорта написано.

MadMedic 01.02.2021 06:33

Ответ: Вопросы
 
Вложений: 1
Вот скрин. Тут и настройки импорта, и ворнинги и кусочек кода

ant0N 01.02.2021 10:39

Ответ: Вопросы
 
Твоя проблема в том, что ты грузишь картинки не через Resourceloader.
Поэтому настройки импорта игнорируются.

Вместо:
temp_image.load("path")

Пиши:
temp_image = load("path")

MadMedic 01.02.2021 10:58

Ответ: Вопросы
 
О, спасибо!

MadMedic 28.04.2021 11:36

Ответ: Вопросы
 
Хм, скрипты обновляются в разных потоках? Получил ситуацию , когда в ходе выполнения функции скрипта, значение переменной другого скрипта изменилось.

Arton 28.04.2021 22:41

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

Сообщение от MadMedic (Сообщение 318820)
Хм, скрипты обновляются в разных потоках? Получил ситуацию , когда в ходе выполнения функции скрипта, значение переменной другого скрипта изменилось.

Я не в курсе потоков, но на всякий случай, у тебя какая версия?

В версии 3.2.3 была ошибка из-за которой после удаления объекта не удалялась ссылка, и вела на новый объект в этой же памяти (часть оптимизации).

Актуальная версия сейчас 3.3

MadMedic 30.04.2021 05:03

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

Сообщение от MadMedic (Сообщение 318820)
Хм, скрипты обновляются в разных потоках? Получил ситуацию , когда в ходе выполнения функции скрипта, значение переменной другого скрипта изменилось.

Сорян, это я затупил по серьезному и накосячил, все работает нормально. Еще раз убедился, что Годот классный ))

ant0N 30.04.2021 12:22

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

Сообщение от MadMedic (Сообщение 318820)
Хм, скрипты обновляются в разных потоках?

в одном конечно, иначе нужны были бы всякие мьютексы и вот это вот все

Arton 31.03.2022 07:38

Ответ: Вопросы
 
Вложений: 1
Загружаю сцену:
Создаю переменную Scene
Цитата:

var Scene
Кнопка 1 Загружаю-подключаю
Цитата:

Scene = load("res://Level_1.tscn")
var scene = Scene.instance()
var spat_node = get_node("Spatial")
spat_node.add_child(scene)
Кнопка 2 Удаляю-очищаю
Цитата:

var scene_del = get_node("Node//Level_1")
scene_del.queue_free()
Но я хочу под одной переменной Scene, загружать разные уровни .tscn
И сразу возникает вопрос, как правильно очистить Scene?

В справке рекомендуется queue_free(), ей я могу удалить только инстанс загруженной сцены.

Если я копирую код выше, но меняю загрузку на Level_2.tscn
И начинаю по очереди загружать-выгружать разные сцены.
То в консоли видно что с каждой подобной загрузкой, увеличивается PackedScene (см. скриншот).
Получается в памяти продолжают висеть объекты. Что логично, я ведь ничего не делаю с Scene.

Вопрос правильно удалять ресурсы? Как полностью очистить Scene что бы загрузить под ней новую?
Какой подход вернее, 1 переменная для загрузки всех уровней, или для каждой своя переменная?



Вложение 23384

ant0N 31.03.2022 11:00

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

Сообщение от Arton (Сообщение 319189)
В справке рекомендуется queue_free(), ей я могу удалить только инстанс загруженной сцены.

Да, так и надо делать

Мне кажется что твоя проблема в том, что ты на самом деле не удаляешь прошлую сцену
вот ты ее создаешь:
Код:

var scene = Scene.instance()
var spat_node = get_node("Spatial")
spat_node.add_child(scene)

а вот удаляешь:
Код:

var scene_del = get_node("Node//Level_1")
scene_del.queue_free()

что за путь такой? get_node("Node//Level_1")

Попробуй у себя сделать удаление так:
Код:

var spat_node = get_node("Spatial")
for n in spat_node.get_children()
    n.queue_free()


Arton 31.03.2022 20:54

Ответ: Вопросы
 
Вложений: 1
Цитата:

Сообщение от Arton (Сообщение 319189)
Загружаю сцену:
Создаю переменную Scene

ant0N ответил в чате.

Короче всё правильно. Надо удалять ноду, о загруженном ресурсе беспокоится не надо.
При необходимости его можно обнулить Scene = null.
Система так и работает, загрузить ресурс, создать его инстанс, подключить к нужной ноде.

Примерный код:

Подробности тут - Reference.


Вложение 23385

Arton 19.06.2022 07:25

Ответ: Вопросы
 
У меня созрел вопрос (в контексте движка).
Как правильно организовать программную часть игры.

Самый простой способ, на каждый активный объект: дверь, персонаж, враг и т. д. Нацепить скрипт, обернуть в сцену. И расставить на игровой-сцене инстансы.
Просто, быстро, сердито.

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


Как «правильно», насколько допустим первый вариант вне прототипа?
Какая разница в скорости выполнения и т. п.?


P. S. Написал и подумал, только во втором варианте можно нормально организовать работу через потоки.

ant0N 19.06.2022 10:55

Ответ: Вопросы
 
Вопрос слишком абстрактный. Если ты спрашиваешь как сделать архитектуру игры, то на этот вопрос нет правильно ответа, есть лишь разного рода паттерны.

Советовать конкретный паттерн бессмысленно, это зависит от проекта.
Но есть некоторые правила, которым следует придерживаться:
- единая точка входа в игру, единый апдейт.
- скрипты, которые ты весишь на объекты в редакторе - просто вьюшки, в них не должно быть логики.
Вся логика должна быть на другом уровне (в Контроллерах, в случае MVC или в Системах - если ECS)


В общем, тут мне проще тебе объяснять на живом примере уже в IDE, чем расписывать это на форуме


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

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