И вот, теперь и рисует по маске цвета

Белый перекрасился в другой цвет
Белый перекрасился в другой цвет

Само по себе 2d отрисовка шейдерами довольно-таки простая и позволяет обходиться без больших движков. Весь код пишется на С и это даже не C++.

Теперь можно красить пол. Дальнейшая задача добавить в движок массив тайлов, который надо заполнять по ширине и высоте.

Вот функция отвечающая за шейдер маски.

#include <shader-render/shader-sprite.h> #include <platform.h> #include <camera.h> #include <sprite.h> #include <stdio.h> #include <stdlib.h> #include <game.h> #include <mask-sprite.h> struct priv_sprite { uint32_t camera; uint32_t ortho; uint32_t transform; uint32_t scale; uint32_t model; uint32_t texture0; uint32_t mask_color; uint32_t color; }; void shader_mask_sprite_color_init (struct shader *s) { glUseProgram (s->shader); struct priv_sprite *priv = malloc (sizeof (struct priv_sprite)); priv->camera = glGetUniformLocation (s->shader, "Camera"); priv->ortho = glGetUniformLocation (s->shader, "Ortho"); priv->transform = glGetUniformLocation (s->shader, "Transform"); priv->scale = glGetUniformLocation (s->shader, "Scale"); priv->model = glGetUniformLocation (s->shader, "Model"); priv->texture0 = glGetUniformLocation (s->shader, "Texture0"); priv->mask_color = glGetUniformLocation (s->shader, "mask_color"); priv->color = glGetUniformLocation (s->shader, "color"); glUseProgram (0); s->priv = priv; } void shader_mask_sprite_color_render (struct shader *s, void *_data, struct camera *cam, void *child) { struct mask_sprite *mask = child; struct sprite *sp = _data; struct priv_sprite *priv = s->priv; glUseProgram (s->shader); glActiveTexture (GL_TEXTURE0); glBindTexture (GL_TEXTURE_2D, sp->textures0[sp->cur_tex]); glUniform1i (priv->texture0, 0); glBindVertexArray (sp->vao); glUniformMatrix4fv (priv->ortho, 1, GL_FALSE, sp->ortho); glUniformMatrix4fv (priv->transform, 1, GL_FALSE, sp->transform); glUniformMatrix4fv (priv->model, 1, GL_FALSE, sp->model); glUniformMatrix4fv (priv->scale, 1, GL_FALSE, sp->scale); glUniformMatrix4fv (priv->camera, 1, GL_FALSE, cam->view); glUniform3fv (priv->mask_color, 1, mask->mask_color); glUniform3fv (priv->color, 1, mask->color); glEnableVertexAttribArray (0); glEnableVertexAttribArray (1); glDrawArrays (GL_TRIANGLES, 0, 6); }

Сам фрагментный шейдер довольно простой. Ищем цвет маски и заменяем его.

#version 450 core precision mediump float; in vec2 tex_coordinates; uniform sampler2D Texture0; uniform vec3 color; uniform vec3 mask_color; layout (location = 0) out vec4 color_point; void main () { color_point = texture (Texture0, tex_coordinates); if ((color_point.x == mask_color.x) && (color_point.y == mask_color.y) && (color_point.z == mask_color.z)) { color_point.xyz = color.xyz; } }
3
2
7 комментариев