LINUX.ORG.RU
ФорумGames

Как отрендерить в UV развёртку

 , , , ,


0

1

Пятница (где-то ещё да), вечер я нахайдакался на огороде и туплю.

Пришёл я такой уставший сел, гугль открыл вбиваю «гей» и гугл мне выдаёт подсказку «геймдев ру» я рад что гугл нормальный поц и херню не советует :D и я натыкаюсь на статью https://gamedev.ru/art/tip/scene_to_normalmap для Ъ там про создание карты нормалей через сцену с освещением в любом по сути редакторе, я такой сижу и думаю, клёво же, у меня в форке Corange автоматически к моделям не имеющим карты нормалей задаётся заглушка вот такая https://i.imgur.com/k8DPT9d.png что бы нормали были полюбому и всё бликовало если надо бликовать.

Но я глядя на статью подумал надо попробовать не вставлять заглушку, а генерировать кару нормалей и использовать уже «полноценную» полностью на автомате, для начала по бырому сделал сцену и освещение как в статье получилось вот так https://i.imgur.com/4EEu5bg.jpg https://i.imgur.com/NAOQN5L.jpg https://i.imgur.com/VRmYVtH.jpg https://i.imgur.com/FQrWSXL.jpg

Ну для начала хватит тут всё просто, получается типа карта нормалей по сути, теперь можно поступить двумя путями, прямо в игровой сцене сделать рендер такой карты нормалей в текстуру прямо в таком виде как на картинке, затем отрендерить диффуз (цветовую текстуру) а затем просто к диффузной текстуре отрендеренной при освещении применить наши нормали, при этом нам чхать на uv и прочее оно не надо уже. Я чисто мысленно подумал короче это будет всё прикольно, но дорого, то я просто сразу беру цвет, нормаль, спекуляр и прочее и произвожу отрисовку, а тут этап ещё один вклинивается,попробую конечно но потом. А чё я хочу то, вернее в чём я туплю эмм. Есть идеи как это запечь? То есть взять UV модели и спроецировать рендер на UV у меня мыслей ноль. ::) Советы типа - «посмотри как в blender реализовано рисование на модели, там сразу в uv отображается» не прикатят, я там годами буду разбираться. На прямую сделать то что я хочу вроде как никак, но может хак какой или я хз. Всё я спать =)

★★★★★

Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)

То есть взять UV модели и спроецировать рендер на UV у меня мыслей ноль. ::)

А в доке об этом ничего?

Советы типа - «посмотри как в blender реализовано рисование на модели, там сразу в uv отображается» не прикатят, я там годами буду разбираться

Смотря в чем ты хочешь разобраться, в коде реализации или как это пользователем делается? Если второе,, то за пару вечеров разберешься.

И вообще, ты разработчик или пользователь этой софтины? Я ничего не понял из твоего поста.

Deleted
()
Ответ на: комментарий от Deleted

Потому, что это не текстурка для отображения на модели, а данные для внутренних расчётов освещения, выведенные как диффузная текстура.

anonymous
()
Ответ на: комментарий от Deleted

Да, это нормаль в диффузе. Но какая разница? rgb цвет в диффузе и координаты в нормали. Технически разницы ноль.

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

И да сцена на Corange (его форке который пока что называется egnaroc)

Да собственно вот она сцена если надо (хотя это лишнее наверное)

#include "egnaroc.h"


int main(int argc, char *argv[])
{
    egnaroc_init("../../assets_core");
    camera * cam = entity_new("cam",camera);
    renderer * dr = entity_new("dr",renderer);
    renderer_set_camera(dr,cam);

    light * l_x_pos = entity_new("l_x_pos",light);
    light * l_x_neg = entity_new("l_x_neg",light);
    light * l_y_pos = entity_new("l_y_pos",light);
    light * l_y_neg = entity_new("l_y_neg",light);
    light * l_z_pos = entity_new("l_z_pos",light);
    light * l_z_neg = entity_new("l_z_neg",light);

    float l_pose  = 24.0f;
    int   l_type  = LIGHT_TYPE_DIRECTIONAL;
    float l_power = 1;
    vec3  target  = vec3_zero();

    light_set_type(l_x_pos,l_type);
    light_set_type(l_x_neg,l_type);
    light_set_type(l_y_pos,l_type);
    light_set_type(l_y_neg,l_type);
    light_set_type(l_z_pos,l_type);
    light_set_type(l_z_neg,l_type);

    l_x_pos->target = target;
    l_x_neg->target = target;
    l_y_pos->target = target;
    l_y_neg->target = target;
    l_z_pos->target = target;
    l_z_neg->target = target;

    l_x_pos->power = l_power;
    l_x_neg->power = l_power;
    l_y_pos->power = l_power;
    l_y_neg->power = l_power;
    l_z_pos->power = l_power;
    l_z_neg->power = l_power;

    l_x_pos->diffuse_color = vec3_red();
    l_x_neg->diffuse_color = vec3_red();
    l_y_pos->diffuse_color = vec3_green();
    l_y_neg->diffuse_color = vec3_green();
    l_z_pos->diffuse_color = vec3_blue();
    l_z_neg->diffuse_color = vec3_blue();

    l_x_pos->position = vec3_new(  l_pose,0.0,0.0);
    l_x_neg->position = vec3_new( -l_pose,0.0,0.0);
    l_y_pos->position = vec3_new( 0.0, l_pose,0.0);
    l_y_neg->position = vec3_new( 0.0,-l_pose,0.0);
    l_z_pos->position = vec3_new( 0.0,0.0, l_pose);
    l_z_neg->position = vec3_new( 0.0,0.0,-l_pose);

    ellipsoid el1 = ellipsoid_new( vec3_new(  l_pose,0.0,0.0),vec3_one());
    ellipsoid el2 = ellipsoid_new( vec3_new( -l_pose,0.0,0.0),vec3_one());
    ellipsoid el3 = ellipsoid_new( vec3_new( 0.0, l_pose,0.0),vec3_one());
    ellipsoid el4 = ellipsoid_new( vec3_new( 0.0,-l_pose,0.0),vec3_one());
    ellipsoid el5 = ellipsoid_new( vec3_new( 0.0,0.0, l_pose),vec3_one());
    ellipsoid el6 = ellipsoid_new( vec3_new( 0.0,0.0,-l_pose),vec3_one());


    dr->skydome_enabled = false;
    dr->sky->sun_power = 0;
    static_object * obj = entity_new("obj",static_object);
    obj->position = target;

    while(!keyboard_get_keystate("esc"))
    {
       frame_run();
       frame_set_rate(60);
       while(event_update())
       {
            if(dragdrop_evented())
            {
                if(dragdrop_evented_file() && dragdrop_event_file_extension_filter("obj"))
                {
                    asset_folder_load(dragdrop_event_file_location());
                    obj->renderable = asset_hndl_new_load(dragdrop_event_file());
                }
            }
       };
       camera_control_freecam(cam,frame_get_time());

       if(!asset_hndl_isnull(&obj->renderable))
       {
            renderer_add(dr,render_object_static(obj));
       }

       renderer_add_dyn_light(dr,l_x_pos);
       renderer_add_dyn_light(dr,l_x_neg);
       renderer_add_dyn_light(dr,l_y_pos);
       renderer_add_dyn_light(dr,l_y_neg);
       renderer_add_dyn_light(dr,l_z_pos);
       renderer_add_dyn_light(dr,l_z_neg);

       /*
       renderer_add(dr,render_object_ellipsoid(el1));
       renderer_add(dr,render_object_ellipsoid(el2));
       renderer_add(dr,render_object_ellipsoid(el3));
       renderer_add(dr,render_object_ellipsoid(el4));
       renderer_add(dr,render_object_ellipsoid(el5));
       renderer_add(dr,render_object_ellipsoid(el6));
       */

       renderer_render(dr);
       graphics_swap();
       frame_end();
    }
    egnaroc_quit();
    return 0;
}

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от LINUX-ORG-RU

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

anonymous
()
Ответ на: комментарий от anonymous

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

Да спать хочется и рубит уже не хило, извиняюсь

Это не то, что нужно?

Не, мне надо

  • взять модель

  • отрендерить её так чтобы диффуз цвет был как карта нормалей

  • наложить диффузный цвет на UV модели

  • отрендерить UV модели с наложенным диффузным цветом в текстуру

  • сохранить результат в файл

  • использовать результат как карту нормалей ибо это она уже и есть

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от anonymous

А нельзя просто записать эту самую линию в буфер текстуры попиксельно?

Я вот думал как, но чёт не придумал, мне же надо всю развёртку закрасить, а не только то что видно. Ой я всё пойду спать, завтра покумекаем. А то я ща буду фигню несвязную нести =)

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от LINUX-ORG-RU

надо всю развёртку закрасить, а не только то что видно

Я героически высчитывал что, куда и зачем врукопашную. Но, дуракам, как известно, закон не писан.

Ой я всё пойду спать, завтра покумекаем

Постараюсь завтра заглянуть.

anonymous
()
Ответ на: комментарий от LINUX-ORG-RU

Ну ты же понимаешь, что создание модели и развертки, запекание всего этого происходит в 3D-редакторе (Blender). А потом в движке просто загружаешь модельку со всеми причиндалами, настраиваешь освещение и прочее. По крайней мере, в panda3d и unity3d ничего про запекание не нашел. Может я плохо искал. Гугл по запросу texture bake намекает на 3D-редакторы.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

Зачитать из файла, привязать буфер, применить normalize, помножить на свет, помножить на текстуру, записать буфер обратно в файл. Самое страшное, что я не могу найти, откуда спёр этот код.

anonymous
()
Ответ на: комментарий от LINUX-ORG-RU

Да, напоминает то, что я писал для Panda3D, но то был Python.

Deleted
()

Тебе просто не нужны шейдеры, еслы ты хочешь вручную посчитать карту нормалей, то что у тебя получилось в итоге через шейдер не записать в текстуру. Скорее всего нужно все это вручную посчитать - пробежаться по всем полигонам и в зависимости от нормали записать нужные цвета (возможно с какой-то дополнительной интерполяцией), карты нормалей обычно считаются на highpoly моделях и потом уже применяются к lowpoly. Проще всего конечно же все это сделать в том же блендере, либо FBO - несколько проходов в финале все текстуры перемножить.

Я чисто мысленно подумал короче это будет всё прикольно, но дорого

Современные видеокарты на раз два подобные задачи решают, современные игры имеют несколько проходов с намного более сложными расчетами и все работает хорошо.

Int64 ★★★
()

Короче, ну его нахер. Демка осталась может потом соображу как сделать не через попу, а если ещё вспомню про тред то отпишу.

LINUX-ORG-RU ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.