2016-09-26 10 views
0

как изменить цвет поверхности приложения, используя текстуру?создатель игры - как поменять цветовую палитру с помощью шейдеров и текстуры

https://en.wikipedia.org/wiki/List_of_8-bit_computer_hardware_palettes

https://en.wikipedia.org/wiki/List_of_8-bit_computer_hardware_palettes#/media/File:CGA_palette_color_test_chart.png

https://upload.wikimedia.org/wikipedia/commons/c/c5/CGA_palette_color_test_chart.png

мой фрагмент запуска шейдера следующим образом:

varying vec2 v_vTexcoord; 
varying vec4 v_vColour; 

void main() 
{ 
    gl_FragColor = v_vColour * texture2D(gm_BaseTexture, v_vTexcoord); 
} 

благодаря

ответ

1

это можно подойти по-разному, однако , простой способ - создать форму для обоих цветов в вашей палитре в настоящее время и для замены цветов. Например;

uniform vec3 rep1; 
uniform vec3 rep2; 
uniform vec3 rep3; 

uniform vec3 new1; 
uniform vec3 new2; 
uniform vec3 new3; 

, а затем вы можете проверить, является ли выбранный пиксель одним из ваших цветов вместо замены и передать новый цвет, если это так;

//Sample the original pixel 
gl_FragColor = v_vColour * texture2D(gm_BaseTexture, v_vTexcoord); 

//Make it easier to compare (out of 255 instead of 1) 
vec3 test = vec3(
    gl_FragColor.r * 255.0, 
    gl_FragColor.g * 255.0, 
    gl_FragColor.b * 255.0 
); 

//Check if it needs to be replaced 
if (test == rep1) {test = new1;} 
if (test == rep2) {test = new2;} 
if (test == rep3) {test = new3;} 

//return the result in the original format 
gl_FragColor = vec4(
    test.r/255.0, 
    test.g/255.0, 
    test.b/255.0, 
    gl_FragColor.a 
); 

Затем в коде создания комнаты (или другой код инициализации) вы можете установить шейдер и определить палитру следует заменить и что заменить его, например:

// -- Set Pallete -- 
shader_set(sPalleter) 

//Red 
shader_set_uniform_f(shader_get_uniform(sPalleter, "rep1"), 255, 0, 0) 
shader_set_uniform_f(shader_get_uniform(sPalleter, "new1"), 155, 188, 15) 

//White 
shader_set_uniform_f(shader_get_uniform(sPalleter, "rep2"), 255, 255, 255) 
shader_set_uniform_f(shader_get_uniform(sPalleter, "new2"), 48, 98, 48) 

//Black 
shader_set_uniform_f(shader_get_uniform(sPalleter, "rep3"), 0, 0, 0) 
shader_set_uniform_f(shader_get_uniform(sPalleter, "new3"), 15, 56, 15) 

Продолжив это вы могли бы создать спрайт и, возможно, образец его для униформы, в любом случае надеюсь, что это помогло!

 Смежные вопросы

  • Нет связанных вопросов^_^