Nome: Posterização / Alto Contraste
Versão: GameMaker: Studio
Imagens e Videos:
Vertex Shader: Clique para ver o conteúdo
Código: Selecionar todos
//
// Vertex Shader padrão - Não mexemos nas vertices
//
attribute vec3 in_Position; // (x,y,z)
attribute vec4 in_Colour; // (r,g,b,a)
attribute vec2 in_TextureCoord; // (u,v)
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
void main()
{
vec4 object_space_pos = vec4( in_Position.x, in_Position.y, in_Position.z, 1.0);
gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * object_space_pos;
v_vColour = in_Colour;
v_vTexcoord = in_TextureCoord;
}
Fragment Shader: Clique para ver o conteúdo
Código: Selecionar todos
//
// Fragment Shader: Redução de cores
//
// Posição da Textura
varying vec2 v_vTexcoord;
// Divisões
uniform float divisions;
float value;
void main()
{
// Guarda o pixel (rgba) na variavel cc
vec4 cc = texture2D(gm_BaseTexture, v_vTexcoord);
// Define o tamanho de cada pedaço do 'range' de cores
value = 1.0/divisions;
// Faz a aproximação
cc.rgb = floor((cc.rgb/value) + 0.5) * value;
gl_FragColor = cc;
}
Script: Clique para ver o conteúdo
Código: Selecionar todos
///scrColorAmount(Quantidade de cores por canal [RGB])
// Argumento
var amount = argument0 - 1;
// limita
if amount < 1 amount = 1;
if amount > 255 amount = 255;
// Pega o valor de 'divisions'
divis = shader_get_uniform(shReduceColors, "divisions");
// Define valor da quantidade de cores
shader_set_uniform_f(divis, amount);
Instruções de uso:
Esse efeito tem o nome de 'Posterizar' ou também podemos falar em 'alto/baixo contraste'. Ele faz uma limitação de cores a serem usadas através de cálculos de aproximação. No Exemplo uso um script (srcColorAmount) para modificar a quantidade de cores por canal (RGB), ou seja se colocar o valor 2 cada canal poderá usar usar dois valores (0 ou 255) tendo no máximo 8 cores disponíveis (Preto, Branco, Vermelho, Magenta, Ciano, Azul, Amarelo e Verde), ou seja a paleta de 3 bits SECAM.
Se quiser simular algo perto do Nintendinho (NES) coloque o valor 4 e teremos 64 cores (4 * 4 * 4). Porém o NES possui apenas 54 cores usáveis, ou seja o resultado fica parecido, porém não idêntico.
O valor máximo é 256 cores por canal, ou seja 24 Bits - TrueColor.
Para usar o
Shader em toda a tela (Como no exemplo) basta:
- Selecionar o
Shader no Evento
Draw Begin (Pois deve ser ativado antes de qualquer coisa ser desenhada [
Ver referência]);
- Usar o script
srcColorAmount para trocar quantidade de cores;
- Coloque o
shader_reset no Evento
Draw End.
Para usar em algumas sprites ou backgrounds (No evento
Draw):
- Selecionar o
Shader;
- Usar o
srcColorAmount para trocar quantidade de cores;
- Desenhar o que você quer;
- Reiniciar o
Shader com
shader_reset().
Download:
DOWNLOAD - EXEMPLO