Pull to refresh

Comments 13

    if (color == vec3 (0.41, 0.41, 0.41)) {
        fragColor = vec4 (color_up, 1.0);
    } else if (color == vec3 (0.58, 0.58, 0.58)) {
        vec3 col = color_up + vec3 (0.17, 0.17, 0.17);
        fragColor = vec4 (col, 1.0);
    } else if (color == vec3 (0.65, 0.65, 0.65)) {
        vec3 col = color_up + vec3 (0.24, 0.24, 0.24);
        fragColor = vec4 (col, 1.0);
    } else if (color == vec3 (0.75, 0.75, 0.75)) {
        vec3 col = color_up + vec3 (0.34, 0.34, 0.34);
        fragColor = vec4 (col, 1.0);
    } else if (color == vec3 (0.23, 0.23, 0.23)) {
        vec3 col = color_up - vec3 (0.18, 0.18, 0.18);
        fragColor = vec4 (col, 1.0);
    } else if (color == vec3 (0.35, 0.35, 0.35)) {
        fragColor = vec4 (color_down, 1.0);
    } else if (color == vec3 (0.29, 0.29, 0.29)) {
        vec3 col = color_down - vec3 (0.06, 0.06, 0.06);
        fragColor = vec4 (col, 1.0);
    } else if (color == vec3 (0.36, 0.36, 0.36)) {
        vec3 col = color_down + vec3 (0.01, 0.01, 0.01);
        fragColor = vec4 (col, 1.0);
    } else if (color == vec3 (0.39, 0.39, 0.39)) {
        vec3 col = color_down + vec3 (0.04, 0.04, 0.04);
        fragColor = vec4 (col, 1.0);
    } else if (color == vec3 (0.50, 0.50, 0.50)) {
        vec3 col = color_down + vec3 (0.15, 0.15, 0.15);
        fragColor = vec4 (col, 1.0);
    } else {
        fragColor = texture (tex, texCoord);
    }

Какая жесть. А всего-то нужно было заюзать палитру

Названия переменных в шейдере - отдельный ужас. Через пару дней это станет нечитаемым

Вот это еще хорошо смотрится


    r = rr;
    g = gg;
    b = bb;

Ну я не стал остальное разбирать. Там почти весь код такой, что его на общее обозрение выкладывать не стоит. В том же Sprite::setShader половину кода можно просто выкинуть за switch

теперь когда персонаж подходит к столу и исчезает, он передает свои цвета столу и стол по этим оттенкам уже указывает нужный цвет

Ничего не понял.

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

А может проще было z-сортировку реализовать?

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

Когда в своё время экспериментировал с написанием движка, я убрал понятие "шейдер" из основного кода, тем более прямые вызовы в OpenGL, т.к. получаем сильную связность с деталями реализации, и в случае чего было бы дорого переписывать (напр. если нужно портировать на DirectX/Vulkan или добавлять более сложные типы шейдеров).

В итоге я выделил сущности Material и MaterialState. Material -- здесь лежит основная реализация материала (шейдер и прочее), а MaterialState -- это инстанс материала (через Material::createState), применённый к конкретному объекту (там хранятся uniform-значения, например). Таким образом:

  1. детали реализации скрыты, проще портировать и менять/усложнять реализацию (напр., у материала для отрисовки теней может быть ссылка на фреймбуфер)

  2. не нужен switch, т.к. инкапсулировано в отдельный класс

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

  4. впоследствии прекрасно легло на постпроцессинг: напр., были у меня FXAAMaterial и SSAOMaterial (применялось к объекту FrameBuffer)

Такие вот дела.

Мне понравилось. Новичку в графике перед которым встала такая задача будет интересно и полезно увидеть максимально простой велосипед другого человека. Да, так делать нельзя, да, есть более простые и более изящные методы покраски по текстуре, но если это проект для обучения то не вижу проблем в использовании такого подхода.
А если автор не бросит а продолжит заниматься всерьёз то я завидую ему в те моменты когда в голове будет происходить: щелк, «Ааа, вот как оказывается можно было!». Так что реквестирую больше таких статей о проблемах новичков, но без тега *nix. Всяко лучше чем переводы новостей от корпблогов.

А как ещё можно менять определенные цвета у спрайта?

Sign up to leave a comment.

Articles

Change theme settings