내가 일하고 있어요 Megaman의 내가 런타임에 특정 픽셀의 색상을 변경해야 -like 게임. 참고 : Megaman 에서 선택한 무기를 변경하면 주 무기의 팔레트가 선택된 무기를 반영하도록 변경됩니다. 스프라이트의 색상이 모두 변경되는 것은 아니며 특정 색상 만 변경됩니다 .
프로그래머가 팔레트와 픽셀과 팔레트 인덱스 사이의 논리적 매핑에 액세스 할 수 있기 때문에 이러한 종류의 효과는 NES에서 일반적이고 매우 쉽게 수행 할 수 있습니다. 그러나 현대 하드웨어에서는 팔레트 개념이 동일하지 않기 때문에 조금 더 어려워집니다.
내 모든 텍스처는 32 비트이며 팔레트를 사용하지 않습니다.
내가 원하는 효과를 얻는 방법은 두 가지가 있지만이 효과를 쉽게 달성 할 수있는 더 좋은 방법이 있는지 궁금합니다. 내가 아는 두 가지 옵션은 다음과 같습니다.
- "팔레트 교환"동작을 수행하려면 셰이더를 사용하고 GLSL을 작성하십시오.
- 셰이더를 사용할 수없는 경우 (예 : 그래픽 카드에서 셰이더를 지원하지 않기 때문에) "원본"텍스처를 복제하고 미리 적용된 색상 변경으로 다른 버전을 생성 할 수 있습니다.
이상적으로는 셰이더를 사용하고 싶습니다. 직접 보이는 것처럼 보이고 복제 된 텍스처 방법에 반대되는 추가 작업이 거의 필요하지 않습니다. 색상을 변경하기 위해 텍스처를 복제하는 것이 VRAM을 낭비하고 있다고 걱정합니다. 걱정할 필요가 없습니까?
편집 : 나는 받아 들여진 대답의 기술을 사용하여 끝났고 여기에 참조 용 셰이더가 있습니다.
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;
}
두 텍스처 모두 32 비트이며 하나의 텍스처는 모두 같은 크기 (내 경우에는 6 색)의 여러 팔레트를 포함하는 조회 테이블로 사용됩니다. 소스 픽셀의 빨간색 채널을 색상 표의 색인으로 사용합니다. 이것은 Megaman과 같은 팔레트 스와핑을 달성하는 매력처럼 작동했습니다!