И вот, теперь и рисует по маске цвета
Белый перекрасился в другой цвет
Само по себе 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;
}
}
7 комментариев