Комментарии 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);
}
Какая жесть. А всего-то нужно было заюзать палитру
Названия переменных в шейдере - отдельный ужас. Через пару дней это станет нечитаемым
теперь когда персонаж подходит к столу и исчезает, он передает свои цвета столу и стол по этим оттенкам уже указывает нужный цвет
Ничего не понял.
А может проще было z-сортировку реализовать?
Когда в своё время экспериментировал с написанием движка, я убрал понятие "шейдер" из основного кода, тем более прямые вызовы в OpenGL, т.к. получаем сильную связность с деталями реализации, и в случае чего было бы дорого переписывать (напр. если нужно портировать на DirectX/Vulkan или добавлять более сложные типы шейдеров).
В итоге я выделил сущности Material и MaterialState. Material -- здесь лежит основная реализация материала (шейдер и прочее), а MaterialState -- это инстанс материала (через Material::createState), применённый к конкретному объекту (там хранятся uniform-значения, например). Таким образом:
детали реализации скрыты, проще портировать и менять/усложнять реализацию (напр., у материала для отрисовки теней может быть ссылка на фреймбуфер)
не нужен switch, т.к. инкапсулировано в отдельный класс
по материалам можно группировать отрисовку, чтобы не переключать шейдеры слишком часто (не знаю, правда, насколько это актуально на современных картах)
впоследствии прекрасно легло на постпроцессинг: напр., были у меня FXAAMaterial и SSAOMaterial (применялось к объекту FrameBuffer)
Такие вот дела.
А если автор не бросит а продолжит заниматься всерьёз то я завидую ему в те моменты когда в голове будет происходить: щелк, «Ааа, вот как оказывается можно было!». Так что реквестирую больше таких статей о проблемах новичков, но без тега *nix.
Делаем спрайт разных цветов