Pracuję nad grą podobną do Megamana , w której muszę zmienić kolor niektórych pikseli w czasie wykonywania. Dla porównania : w Megaman, kiedy zmieniasz wybraną broń, wówczas zmienia się paleta głównego bohatera, aby odzwierciedlić wybraną broń. Nie wszystkie kolory duszka zmieniają się, tylko niektóre z nich się zmieniają .
Ten rodzaj efektu był powszechny i dość łatwy do zrobienia w NES, ponieważ programista miał dostęp do palety i logicznego mapowania między pikselami i indeksami palety. Jednak na nowoczesnym sprzęcie jest to nieco trudniejsze, ponieważ koncepcja palet nie jest taka sama.
Wszystkie moje tekstury są 32-bitowe i nie używam palet.
Znam dwa sposoby osiągnięcia pożądanego efektu, ale jestem ciekawy, czy istnieją lepsze sposoby na osiągnięcie tego efektu z łatwością. Dwie znane mi opcje to:
- Użyj modułu cieniującego i napisz GLSL, aby wykonać zachowanie „zamiany palet”.
- Jeśli moduły cieniujące nie są dostępne (powiedzmy, ponieważ karta graficzna ich nie obsługuje), możliwe jest sklonowanie „oryginalnych” tekstur i wygenerowanie różnych wersji ze wstępnie zastosowanymi zmianami kolorów.
Idealnie chciałbym użyć modułu cieniującego, ponieważ wydaje się prosty i wymaga niewiele dodatkowej pracy w przeciwieństwie do metody powielonej tekstury. Martwię się, że powielanie tekstur tylko w celu zmiany koloru marnuje pamięć VRAM - czy nie powinienem się tym przejmować?
Edycja : Skończyłem przy użyciu techniki przyjętej odpowiedzi i tutaj jest mój moduł cieniujący w celach informacyjnych.
uniform sampler2D texture;
uniform sampler2D colorTable;
uniform float paletteIndex;
void main()
{
vec2 pos = gl_TexCoord[0].xy;
vec4 color = texture2D(texture, pos);
vec2 index = vec2(color.r + paletteIndex, 0);
vec4 indexedColor = texture2D(colorTable, index);
gl_FragColor = indexedColor;
}
Obie tekstury są 32-bitowe, jedna jest używana jako tabela przeglądowa zawierająca kilka palet, które są tego samego rozmiaru (w moim przypadku 6 kolorów). Używam czerwonego kanału piksela źródłowego jako indeksu do tabeli kolorów. To zadziałało jak urok dla zamiany palet podobnych do Megamana!