Cách tốt nhất để cho phép người chơi hình ảnh nhuộm Dye mà không làm giảm chất lượng màu?


41

Tôi đang tạo một trò chơi isometric (hình ảnh 2D) 2.5D.

Tôi muốn người chơi có thể "nhuộm" áo giáp, quần áo và những thứ khác của họ. Tôi thấy rằng mọi thứ màu xám dẫn đến mất đi một số màu "tự nhiên" hơn. Ví dụ, tạo một con rồng với màu xám đỏ / vàng và sau đó áp dụng màu lớp phủ, dẫn đến một con rồng hoàn toàn màu đỏ với tất cả mất màu thứ cấp. Trong khi đó, nhuộm cùng màu Đỏ / Vàng Rồng Xanh, làm cho nó có Màu Xanh / Trắng trông rất tuyệt.

Các nhân vật trong trò chơi của tôi không có nhiều thiết bị. Trò chơi gần gũi hơn với cách League of Legends xử lý các nhân vật và đồ họa. Có thể có một loại nhân vật (ví dụ: Anh hùng) nhưng nhiều trang phục cho nhân vật làm tùy chọn. Tôi muốn người chơi có thể có nhiều tùy chỉnh nhất có thể trong số lượng "trang phục" và nhân vật bị giới hạn.

Vì vậy, tôi muốn người chơi có thể chọn một nhân vật, chọn một trong nhiều vũ khí, xen kẽ giữa một số lựa chọn trang phục (xếp lớp lên các nhân vật), sau đó nhuộm hầu hết mọi thứ (chọn một màu kim loại cụ thể cho vũ khí, chọn bất kỳ màu nào tất cả cho quần áo).

Nếu tôi có thể sử dụng thang độ xám mà không mất một số màu, tôi sẽ làm thế.

Đây là một ví dụ như những gì tôi đang nói về:

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Thậm chí không thể "nhuộm" Rồng, bất kể tôi sử dụng gì trong các tùy chọn "Lớp phủ màu" của Photoshop. Rõ ràng, tôi đang làm sai nếu có thể tô màu tốt hơn bằng cách sử dụng thang độ xám. Đối với một màu như Xanh lục hoặc Vàng hoặc Tím nhạt hơn, điều này hoạt động tốt. Đối với bất kỳ màu nào khác, nó phá hủy nghệ thuật.

Tuy nhiên, có vẻ tốt hơn nhiều nếu tôi KHÔNG làm mờ nó, và thay vào đó chỉ cần áp dụng màu "HUE" cho ảnh gốc (Đỏ / Vàng).

Huế đỏ nhập mô tả hình ảnh ở đây

Huế tím nhập mô tả hình ảnh ở đây

Bây giờ người chơi có thể nhuộm màu Dragon BẤT K, và nó vẫn trông rất tuyệt! (Màu vàng chuyển sang màu trắng, trong khi màu đỏ chuyển sang bất kỳ màu nào của cầu vồng.)

Điều này có nghĩa là TRẮNG hay ĐEN là màu thứ cấp tốt nhất? Sau đó sử dụng một số loại phương pháp hoặc shader để thay đổi màu trắng (thứ cấp) thành một cái gì đó khác nhau?

Có bài viết nào về phương pháp phức tạp này để chụp một bức ảnh, và dựa trên việc tô màu, nhuộm các pixel khác nhau không?

Đối với Rồng, nó có hoạt động tốt nhất như Rồng tương phản cao Trắng / Đen không? Là màu đỏ / vàng là bộ màu tốt nhất? Hóa ra hình ảnh tốt hơn rất nhiều so với một vài màu khác mà tôi đã thử. Là Grayscale vẫn vượt trội?

Có phải "Blending Options" của Photoshop không bao gồm phương pháp "nhuộm" hình ảnh phù hợp cho trò chơi video không? Có Shader / Phương thức phức tạp nào cho phép tôi đạt được thành công tốt hơn không?

Lưu ý: Nếu GrayScale cho phép tôi giảm mức tiêu thụ RAM của hình ảnh hoặc tránh mất chất lượng trong quá trình nén bị mất, đó sẽ là điều tôi sẽ xem xét nghiêm túc.


5
Điều này là hợp pháp thú vị. Tôi sẽ bỏ phiếu này và hy vọng nó sẽ được chú ý nhiều hơn. Lý thuyết màu sắc là một chủ đề tuyệt vời.
Evan

Xoay vòng Huế là một khả năng, mặc dù là 2D - Tôi không biết liệu nó có hoạt động ở chế độ 3D hay không.
tro999

Cảm ơn Evan. Tôi cũng đồng ý rằng điều này cực kỳ thú vị và là một trong những chủ đề hay nhất mà tôi đã nghiên cứu vào thời gian của mình. Loại hình công việc này, tôi tưởng tượng, hiếm khi được thực hiện bởi vì nó sẽ yêu cầu một nghệ sĩ - nhưng không phải bất kỳ nghệ sĩ nào - một nghệ sĩ liên quan đến lý thuyết màu sắc, các shader trò chơi video, hoặc thậm chí là một nghệ sĩ mã hóa. Tôi chỉ có thể tưởng tượng rằng việc tìm kiếm một người xuất sắc trong cả nghệ thuật và lập trình là rất hiếm. Bên cạnh không có nghiên cứu có thể tìm thấy về chủ đề này trên google. Đặc biệt đối với một người không có ý tưởng gì về các thuật ngữ chính để nghiên cứu. Tôi chắc chắn không phải là một nghệ sĩ.
Carter81

Câu trả lời:


19

Hue-shift là một khả năng cho phép bạn có được một loạt các màu sắc mà không làm mất các chi tiết màu sắc. Ý tưởng cơ bản là chuyển đổi từng pixel từ không gian RGB sang HSV, sau đó bù màu bằng một lượng do người dùng xác định, sau đó chuyển đổi lại thành RGB. Trên thực tế, điều này có thể được thực hiện hiệu quả hơn bằng cách áp dụng ma trận xoay cho các giá trị RGB: tạo ma trận xoay quanh trục (1, 1, 1) theo góc màu do người dùng xác định. Sau đó, bạn có thể chỉ cần áp dụng ma trận này cho từng giá trị RGB trong trình đổ bóng pixel của mình.

Điều này sẽ cho phép con rồng màu đỏ-vàng chuyển sang một con rồng màu vàng-lục, lục-lam, lục lam, lam-lam hoặc đỏ tươi. Đây là một chút hạn chế vì hai màu không thể thay đổi độc lập với phương pháp này. Họ sẽ duy trì màu sắc tương đối như họ là tác giả trong hình ảnh gốc. Ngoài ra còn có một số màu bạn không thể truy cập, ví dụ: bạn không thể tạo ra một con rồng đen trắng theo cách này. Tuy nhiên, điều này có thể là đủ cho mục đích của bạn.

Một khả năng khác, nếu các mô hình của bạn có hai hoặc ba "màu chính" (đỏ và vàng ở đây), bạn có thể tạo ra hình ảnh gốc bằng cách sử dụng một kênh màu riêng cho mỗi màu chính. Trong trường hợp này, bạn là tác giả của rồng đỏ và xanh lá cây thay vì đỏ và vàng, và nếu bạn có màu thứ ba, bạn có thể tạo ra màu xanh lam. Sau đó, bạn có thể cho phép người dùng chọn ba màu chính và sử dụng các giá trị đỏ, lục và lam trong ảnh làm số lượng các màu do người dùng xác định để trộn vào. Vì vậy, trình đổ bóng pixel của bạn sẽ trông giống như

finalColor = image.r * userColor1 + image.g * userColor2 + image.b * userColor3;

Điều này sẽ cho phép người dùng chọn bất kỳ kết hợp màu nào họ muốn, bao gồm những thứ như đen và trắng, hoặc tím và vàng.


1
+1 không chỉ là một câu trả lời hay mà còn là một câu trả lời về một chủ đề hiếm hoi (lý thuyết màu sắc). Tôi không biết tại sao tôi không nghĩ về điều đó trước đây. RGB. Đỏ lục lam. TÂT NHIÊN! Màu sắc tốt nhất để sử dụng có lẽ là ba màu chính xác, do khả năng điều khiển các kênh riêng lẻ.
Carter81

1
Sự thay đổi màu sắc là một chủ đề rất khó khăn vì hầu hết các thông tin hình ảnh được truyền tải bằng độ sáng và chuyển màu đơn giản không giữ được độ sáng. Màu sắc khác nhau có giá trị độ sáng vốn có khác nhau. Bạn cần các thuật toán phức tạp hơn cho điều đó.
API-Beast

10

Vấn đề bạn đang gặp phải là bạn không thể "nhuốm" toàn bộ hình ảnh, diện mạo bạn nhìn thấy không chỉ là một màu cơ bản. Đối với một bạn có độ dốc tốt từ vật liệu này sang vật liệu khác, nhưng quan trọng hơn là bạn cũng có sự phản chiếu, nổi bật và bóng tối, không bị ảnh hưởng bởi màu cơ bản. (Những cái đó về cơ bản được thêm vào trên nó.)

Vì vậy, bạn cần phân tách hình ảnh thành các thành phần của nó.

Một ví dụ :

Hình ảnh giải cấu trúc Ví dụ nhuộm màu

Trong trường hợp này, chúng tôi có 3 lớp:

  • Nền - Phần này chứa các thành phần không nên tô màu.
  • Phần nên được tô màu - Điều này được nhân với màu. (OpenGL nhân theo mặc định nếu bạn chỉ định một màu khác ngoài màu trắng.)
  • Điểm nổi bật - Đây là những phụ gia được vẽ trên toàn bộ hình ảnh. Nó không phải màu trắng mà là màu vàng, để mô phỏng sự thay đổi màu sắc. Các đối tượng không chỉ là một màu duy nhất, màu sắc thay đổi cùng với độ sáng.

+1. Nhưng "bạn không thể đơn giản" tô màu "toàn bộ hình ảnh" là một chút sai lệch. Tất cả phụ thuộc vào sự lựa chọn của OP cho trò chơi của anh ấy. Ví dụ Diablo II đã làm điều đó. Vì vậy, tôi sẽ không quá nghiêm ngặt với các phần "bạn không thể / bạn cần". Đây chỉ là một trong những lựa chọn, nhìn đẹp hơn nhưng tốn nhiều RAM hơn.
Kromster nói hỗ trợ Monica

1
@KromStern Point là, nó trông thật tệ nếu bạn làm điều đó, luôn luôn.
API-Beast

Câu trả lời chính xác. Điều này có thể mặc dù, thông qua tự động hóa? Nếu một người có hàng ngàn hình ảnh hoạt hình cho một nhân vật, việc chọn thủ công từng lớp hoặc phân tách hình ảnh một lần là không khả thi. Tuy nhiên, tôi có thể thấy một số cách giải quyết để giúp tự động hóa nó nếu kết xuất từ ​​3D bằng cách sử dụng mặt nạ, nhưng bất kể đó vẫn là một câu trả lời tuyệt vời.
Carter81

Có khả năng tự động hóa nó bằng cách tìm các màu chủ đạo và trích xuất chúng (bằng cách sử dụng thuật toán "color to alpha" ngược). Nhưng nó không giống như tôi từng thực hiện một cái gì đó như thế.
API-Beast

Để trích xuất các điểm nổi bật, bạn có thể lấy mặt nạ mà bạn đã trích xuất trước đó và lọc nó để bạn chỉ còn lại các thành phần sáng nhất.
API-Beast

3

Cá nhân tôi khuyên bạn nên sử dụng kết cấu mặt nạ để đạt được những gì bạn muốn. Điều này sẽ đảm bảo rằng kết cấu RGB24 chính của bạn sẽ giữ được chất lượng màu gốc mà không làm mất đi độ chính xác. Nó cũng sẽ cung cấp cho bạn nhiều tự do nghệ thuật để pha trộn kết cấu chính của bạn với mặt nạ màu của bạn.

Mỗi mặt nạ có thể được xem như một kết cấu thang độ xám sẽ nội suy tuyến tính màu của kết cấu cơ sở với màu tùy chỉnh của bạn. Giả sử bạn đang cho phép người dùng của mình tùy chỉnh hai màu, trình đổ bóng pixel sẽ trông giống như thế này:

đầu vào: MainTexture (RGB), Mask1Texture (A), Mask2Texture (A), Colour1 (float), Colour2 (float)

đầu ra: (Mask1Texture + Mask2Texture) -MainTexture + Colour1 * Mask1Texture + Colour2 * Mask2Texture

Điều này cho thấy rằng càng nhiều mặt nạ có giá trị lớn cho một pixel thì kết cấu chính của bạn sẽ càng ít ảnh hưởng đến màu đầu ra của pixel đó. Ví dụ, bạn có thể chuyển đổi kết cấu rồng của mình thành màu xám và xóa mọi thứ trừ đôi cánh của bạn để có màu cánh tùy chỉnh bất kể màu cơ thể.

Tôi đã sử dụng kỹ thuật này cho các trò chơi di động và nó sẽ không ảnh hưởng đến hiệu suất chung của bạn. Nó có thể khiến bạn tốn thêm 33% RAM cho mỗi kết cấu nhưng sự đánh đổi về chất lượng có lẽ là xứng đáng.

Ps Nếu bạn chỉ nghĩ đến việc sử dụng một màu tùy chỉnh, bạn chỉ cần sử dụng kênh Alpha của kết cấu chính RGBA32 làm mặt nạ.


2

bạn có thể sử dụng bảng màu và để người chơi chỉnh sửa bảng màu. Nếu bạn sử dụng các shader, bạn có thể sử dụng họa tiết 1D làm bảng màu và giá trị màu xám ban đầu làm chỉ mục.

Để chuyển đổi một hình ảnh màu thực sự thành một hình ảnh với 255 màu, bạn có thể lấy tất cả các giá trị màu pixel của mình và nhóm chúng trong không gian màu 3d thành 255 cụm với thuật toán k-mean. Hoặc sử dụng các công cụ chuyển đổi hình ảnh chung chung. Sau đó, điều quan trọng là phải đề cập rằng nội suy của kết cấu giá trị màu xám sẽ là một phép nội suy các chỉ số trong kết cấu màu của bạn. Điều này có thể dẫn đến một kết quả trong đó bạn có một số màu giữa hai texels của hình ảnh gốc của bạn. Điều này có thể được giải quyết bằng cách vô hiệu hóa phép nội suy (tôi nghĩ rằng bạn không muốn làm điều đó) hoặc bằng cách sắp xếp bảng màu của bạn theo cách hữu ích.


Đây là cơ bản những gì tôi đã suy nghĩ là tốt. Bạn có thể muốn mở rộng câu trả lời cho một cái gì đó đầy đủ hơn một chút. Về cơ bản, bạn cho phép người dùng chọn hai màu (hoặc nhiều hơn hoặc ít hơn, nhưng để tranh luận, 2), tạo kết cấu 1D mờ dần từ hai màu. Sử dụng kết cấu thang độ xám trên hình học đóng vai trò tham chiếu trong kết cấu 1D. Người dùng vẫn có thể đặt các màu xấu, nhưng ít nhất họ có tùy chọn thực hiện các lựa chọn màu tương phản đẹp.
wrosecrans

vâng, bạn cũng có thể lấy được bảng màu 255 đầy đủ từ ít màu người dùng hơn, nhưng ở đây tôi chỉ có thể khuyên bạn dùng thử. Tôi biết rằng rất nhiều trò chơi cũ đã sử dụng các thay đổi trong bảng màu để tạo ra các biến thể trong quái vật của chúng. Tôi nghĩ Diablo đã làm điều đó.
Arne

1

bạn có thể chuyển đổi hình ảnh thành hình ảnh màu xám nhưng vẫn lưu nó với các kênh rgba. lưu trữ một giá trị trọng lượng trong kênh alpha sau đó sử dụng giá trị này để quyết định lượng thuốc nhuộm sẽ áp dụng cho một pixel. trọng lượng này có thể được tính dựa trên mức độ gần với màu trắng. pixel càng gần màu trắng thì nên nhuộm càng ít hoặc trọng lượng càng thấp. điều này sẽ để lại hầu hết các điểm nổi bật với độ sáng ban đầu của chúng, nhưng áp dụng một chút thuốc nhuộm cho nó. màu pixel cuối cùng có thể được tìm thấy bằng cách tính toán từng kênh Ro + (Rd * Ao) trong đó Ro là màu đỏ ban đầu, Rd là màu đỏ trong màu nhuộm và Ao là Alpha của bản gốc. vì vậy tất cả các pixel trắng không có màu mới và tất cả các pixel đen giả định màu nhuộm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.