Tôi đang làm việc trên một trò chơi giống Megaman , nơi tôi cần thay đổi màu của một số pixel nhất định khi chạy. Để tham khảo : trong Megaman khi bạn thay đổi vũ khí đã chọn thì bảng màu của nhân vật chính sẽ thay đổi để phản ánh vũ khí đã chọn. Không phải tất cả các màu của sprite thay đổi, chỉ một số màu nhất định làm .
Loại hiệu ứng này khá phổ biến và khá dễ thực hiện trên NES vì lập trình viên có quyền truy cập vào bảng màu và ánh xạ logic giữa các pixel và chỉ số bảng màu. Tuy nhiên, trên phần cứng hiện đại, điều này khó khăn hơn một chút vì khái niệm bảng màu không giống nhau.
Tất cả các kết cấu của tôi là 32 bit và không sử dụng bảng màu.
Có hai cách tôi biết để đạt được hiệu quả tôi muốn, nhưng tôi tò mò liệu có cách nào tốt hơn để đạt được hiệu ứng này một cách dễ dàng không. Hai tùy chọn tôi biết là:
- Sử dụng một shader và viết một số GLSL để thực hiện hành vi "tráo đổi bảng màu".
- Nếu các shader không có sẵn (giả sử, vì card đồ họa không hỗ trợ chúng) thì có thể sao chép họa tiết "gốc" và tạo các phiên bản khác nhau với các thay đổi màu được áp dụng trước.
Lý tưởng nhất là tôi muốn sử dụng một shader vì nó có vẻ đơn giản và đòi hỏi ít công việc bổ sung trái ngược với phương pháp kết cấu trùng lặp. Tôi lo lắng rằng việc sao chép họa tiết chỉ để thay đổi màu sắc trong chúng là lãng phí VRAM - tôi có nên lo lắng về điều đó không?
Chỉnh sửa : Tôi đã kết thúc bằng cách sử dụng kỹ thuật của câu trả lời được chấp nhận và đây là shader của tôi để tham khảo.
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;
}
Cả hai kết cấu là 32 bit, một kết cấu được sử dụng làm bảng tra cứu có chứa một số bảng màu có cùng kích thước (trong trường hợp của tôi là 6 màu). Tôi sử dụng kênh màu đỏ của pixel nguồn làm chỉ mục cho bảng màu. Điều này hoạt động như một cơ duyên để đạt được hoán đổi bảng màu giống Megaman!