Tổng hợp gamma trong game là gì

Bình luận về gamma trong game là gì là ý tưởng trong bài viết hôm nay của Tengamehay.net

Rất nhiều nhà thiết kế 3D cho rằng khái niệm này khá khó hiểu và thường gây nhầm lẫn, tuy nhiên thực tế thì nó không quá khó đến mức như vậy đâu, tin tôi đi. Với Linear Workflow, việc tính toán ánh sáng và màu sắc xuyên suốt toàn bộ quy trình từ lúc thiết lập render cho đến khi xử lý hậu kỳ, sẽ đều chính xác cả. Và nó cũng rất cần thiết nếu bạn muốn đạt được tính chân thực trong các bức ảnh render của mình.

Đang xem: Gamma trong game là gì

Linear Workflow là một khái niệm nói về cách mà gamma hoạt động như thế nào. Để hiểu khái niệm này, bạn cần biết gamma là gì, tại sao nó lại tồn tại và cách kiểm soát nó như thế nào. Tôi sẽ quay trở lại chủ đề này sau, trước tiên hãy xem qua một vài ví dụ trước đã.

*

Đây là ví dụ một bức ảnh được render mà không có hiệu chỉnh về gamma. Hãy để ý rằng ánh sáng không nảy qua lại và điền đầy không gian căn phòng, kể cả khi nó được render với vRay GI.

*

Có thể hiệu chỉnh gamma trong giai đoạn hậu kỳ sau khi rendering, nhờ đó mà ánh sáng đã điền đầy không gian căn phòng. Tuy nhiên vấn đề là kết quả trông bị bạc màu, màu sắc bị phai mờ do tính toán sai. Các quả bóng màu trên sàn là clean shader từ 3ds max nên màu sắc ở đây hiển thị đúng. Tuy nhiên, phần màu sắc trong texture ở trên sàn nhà và trong bức tranh trên tường thì không. Độ thẫm (saturation) và độ tương phản (contrast) cũng không được hiệu chỉnh tốt ở đây.

*

Với các thiết lập đúng trong linear workflow, cả phần màu sắc và ánh sáng đều được hiển thị đúng và cho kết quả tốt.

Cũng có một số lợi ích khác khi sử dụng linear workflow khi nó có 32 bits ứng với mỗi kênh dữ liệu. Các bức ảnh thông thường (như JPG) chỉ có 8 bits mỗi kênh (kênh R,G và B) cho ra kết quả đầu ra khá ổn, tuy nhiên vì chúng lại không chứa đầy đủ thông tin vốn rất cần thiết và hữu ích cho quá trình xử lý hậu kỳ. Hãy để ý cách một bức hình 32bits chứa thông tin ở những vùng quá sáng, bạn có thể thấy được sự phản chiếu ánh sáng trên nền nhà được thay thế bởi các pixel với thông tin mới ra sao. Tuy nhiên, một bức ảnh 8bits sẽ không biết được “cái gì đang nằm ẩn dưới” những white pixels kia, và vì vậy nó hiển thị thành màu xám khi độ phơi sáng giảm. Tương tự, nếu bạn đang làm DOF hay glare/bloom trong phần hậu kỳ, bạn cũng sẽ để ý thấy cách một bức ảnh 32bits làm tăng chất lượng của các hiệu ứng này như thế nào.

Bây giờ, trước khi đi vào phần Gamma, bạn cần biết một số thực tế về cách mà con người cảm nhận ánh sáng ra sao. Các giác quan mà chúng ta có, không phản ứng theo một cách “tuyến tính”. Nói cách khác, nếu bạn cầm một quả tạ 1/2 kg trong tay và rồi thêm vào một quả tạ 1/2 kg khác, bạn có thể dễ dàng định rõ được ràng trọng lượng đã tăng lên gấp đôi. Nhưng nếu bạn đang cầm một hòn đá 50 kilograms, và rồi thêm vào một quả tạ 1/2 kg, có thể bạn sẽ khó mà nhận ra được sự khác biệt.

Điều tương tự cũng xảy ra với âm thanh và thị giác của con người.

*

Như bạn có thể thấy, chúng ta có thể dễ dàng phân biệt được sự khác nhau giữa ánh sáng của một bóng đèn 50w và 51w. Tuy nhiên, chúng ta lại không thể phân biệt được cùng một sự khác biệt đó trong trường hợp giữa bóng 150w và 151w, kể cả khi lượng tăng lên là như nhau. Dưới đây là đường cong minh họa cho cách con người phản ứng với các cường độ ánh khác nhau ra sao.

*

Vì chúng ta không thể phân biệt rõ được sự khác nhau trong vùng ánh sáng cường độ quá cao, nên sẽ lãng phí các bit dữ liệu cho việc encode bức hình với cùng mật độ dữ liệu trên toàn quang phổ (Encode là việc lưu trữ dữ liệu, dưới định dạng JPEG chẳng hạn…) Nói cách khác, chúng ta không cần mật độ dữ liệu như nhau tại các vùng quá sáng, nhưng lại cần nó ở những vùng tối. Trên thực tế, nếu bạn là một bức ảnh được mã hóa theo dạng tuyến tính (linear encode), bạn sẽ cần đến 14bits dữ liệu theo mỗi kênh, để có thể đạt được cùng chất lượng như ảnh JPEG thông thường vốn chỉ có 8bits theo mỗi kênh. Phần trên cùng của nó, bạn sẽ có nhiều thông tin tại các khu vực quá sáng hơn so với mắt người có thể phân biệt được, đây là một lãng phí các bit dữ liệu.

Vâng, điều đó có nghĩa là một bức ảnh JPEG được mã hóa theo dạng không tuyến tính (non-linear). Thực tế là ảnh JPEG và hầu hết tất cả các ảnh 8bits đều được mã hóa theo cùng một đường cong như đã minh họa trong phần cảm nhận của mắt người về ánh sáng trong phần trên. Đường cong này được gọi là Gamma 2,2.

*

.Bạn có bao giờ để ý là các giá trị pick màu đều nằm trong khoảng từ 0 đến 255 chưa? Đây được gọi là một Tristimulus value.

Dưới đây là cách một bức ảnh 8bit được mã hóa:

Để ý rằng các giá trị tristimulus values nhỏ hơn ở những vùng tối và lớn hơn ở những vùng sáng. Điều này dẫn đến việc sẽ có nhiều thông tin hơn tại những vùng tối, và do đó chúng ta có thể tận dụng được lợi ích từ việc cảm nhận của mắt người về ánh sáng, bằng cách tập trung dữ liệu tại những vùng tối của bức ảnh. Bây giờ, sau khi áp dụng mã hóa này, những gì thực sự diễn ra cho bức ảnh (bên

phải) là toàn bộ bức ảnh như được tẩy trắng và sáng hơn giống như thế này:

*

Tới đây bạn có thể tự hỏi: vậy tại sao tất cả các bức ảnh 8bits lại trông không bị sáng lên sau đó? Hãy xem tiếp những gì xảy ra sau quá trình mã hóa. Trong quá khứ, khi hầu hết chúng ta đều sử dụng màn hình CRT, điều may mắn là cách mà nguồn điện đầu vào tạo ra độ sáng cho các pixel đầu ra tuân theo một quy luật hoàn toàn trái ngược với cách cảm nhận của mắt người về ánh sáng (vốn được chúng ta sử dụng khi mã hóa bức hình)

Bạn hãy để ý cách mà độ sáng màn hình tăng lên chầm chậm khi điện áp tăng, trước khi nó đạt được đủ mức điện áp để bật lên. Như bạn có thể thấy, đường cong trông trái ngược với đường cong minh họa cách cảm nhận của mắt người về ánh sáng ở trên, vốn được sử dụng để mã hóa bức hình. Với kiến thức về mã hóa gamma encoding và quy luật về điện áp của màn hình CRT ở trên, kết quả tổng sau cùng sẽ như sau:

*

Đối với các màn hình phẳng mà chúng ta sử dụng ngày nay thì không phản ứng với mức điện áp đầu vào như kiểu của CRT. Nhưng để đạt được cùng kết quả đầu ra, các màn hình ngày nay có một đường cong gamma được lập trình sẵn để hiển thị dữ liệu hình một cách chính xác. Nói cách khác thì nguyên lý hoàn toàn giống với trước đó.

Vậy, tất cả những điều này có liên quan gì đến việc rendering của bạn?

Khi làm việc với các bản render trong 3Ds max, tất cả các dữ liệu hình ảnh sẽ được xem là ánh sáng tuyến tính. Vì nó giúp việc tính toán dễ dàng hơn, và thực ra thì cũng không có cái gọi là ánh sáng không tuyến tính (non-linear light) trong thế giới thực. Đồng nghĩa với việc khi bản render làm việc với màu sắc, ánh sáng và texture, mọi thứ phải được sử dụng hoặc chuyển đổi sang không gian tuyến tính. Gọi là tuyến tính vì đường gamma không còn là một đường cong nữa mà ở dạng một đường thẳng tuyến tính, gọi là Gamma 1.0

*

Hãy để tôi giải thích rõ hơn. Điều gì xảy ra nếu việc tính toán được thực thi mà không cần chuyển sang không gian màu tuyến tính, đó là tỷ số giữa giá trị tristimulus và độ sáng thực tế ở đầu ra sẽ không khớp nhau.

*

Như được minh họa ở trên, một nửa của giá trị tristimulus tối đa (50% của 255 ~ 128) thì không khớp với một nửa tức 50% độ sáng đầu ra, mà chỉ ở mức 22%. Việc tính toán sẽ trở nên không đúng nếu thực hiện trong không gian không tuyến tính là vậy. Nếu việc tính toán được thực hiện trong không gian tuyến tính thì, tỷ số này sẽ trùng khớp với nhau như hình minh họa bên dưới:

*

Tới đây, hy vọng là bạn đã có cái nhìn rõ hơn về cách hoạt động của Gamma rồi phải không nào. Giờ là lúc tìm hiểu về cách vận dụng chúng trong quá trình làm việc của chúng ta.

Nếu hiển thị trực tiếp không gian màu tuyến tính lên màn hình sẽ dẫn đến kết quả bị quá sáng. Vậy, mẹo ở đây là vẫn giữ mọi thứ được xử lý dưới dạng không gian tuyến tính, trong khi đó ta có thể điều chỉnh việc render và các passes với một phép hiệu chỉnh Gamma 2.2. Nói cách khác là mọi thứ sẽ được tính toán với Gamma 1.0 nhưng bạn sẽ nhìn thấy nó dưới dạng Gamma 2.2

Hãy nhìn vào cách 3ds max xử lý vấn đề này. Đầu tiên bạn cần kích hoạt tính năng “Enable Gamma/LUT Correction”.

Xem thêm: Esp Game Collection Là Gì ? Gói Dịch Vụ Playstation Plus Collection Là Gì

*

Trên menu của 3d max, vào Customize – > Preferences -> tab Gamma and LUT; đây là nơi chúng ta cần đến đầu tiên. Kích hoạt cả hai check boxes bên dưới mục “Materials and Colors”. Bạn sẽ để ý thấy phần material_editor và color_picker sẽ xuất hiện bị bạc màu lúc này (thỉnh thoảng hãy refresh lại material_editor) và có cảm giác bị thừa. Nhưng đừng lo, bạn đã biết rõ nó rồi phải không nào. Điều này đảm bảo rằng màu sắc mà bạn chọn sẽ được render chính xác.

Thông số gamma bên trái (2,2) là thông số gamma hiển thị. Đây sẽ là viewport, render và display gamma cho bạn điều chỉnh (và nó sẽ không ảnh hưởng đến quá trình tính toán bên trong)

Input gamma: Thông số này báo cho 3ds max biết rằng nó sẽ làm việc với các textures được hiệu chỉnh gamma 2.2. Tất cả các textures sẽ được hiệu chỉnh với 2.2 ngoại trừ HDRI textures. Điều này sẽ được giải thích sau. Output gamma: Đây là cách mà 3ds max lưu trữ bản render đầu ra. Bạn muốn nó là 1, để giữ cho vùng dữ liệu tuyến tính không bị ảnh hưởng khi sử dụng trong phần mềm composition software. Nếu không cần giữ linear workflow sau khi rendering, ví dụ như bạn đang lưu một ảnh JPEG chẳng hạn, bạn có thể thiết lập output gamma là 2.2.

Click vào bức hình bên dưới để phóng to và xem phần mô tả về cách hoạt động chi tiết. Có thể nó sẽ khá rối rắm, nhưng hãy phân tích kỹ theo trình tự được nêu và bạn sẽ có thể hiểu rõ được những gì đang diễn ra.

*

Nếu sử dụng 3ds max framebuffer, gamma hệ thống sẽ điều chỉnh bức hình cho bạn, để kiểm soát việc hiển thị đúng ở đầu ra. Điều này không có nghĩa là bức hình sẽ được lưu theo cách này.

Còn nếu bạn đang sử dụng vRay framebuffer, bạn cần chọn nút sRGB button, để có thể xem ảnh hiển thị đúng ở đầu ra.

Ghi chú: Nếu bạn đang render với mentalyRay, bạn sẽ cần thông báo cho mentalray biết để tiến hành render với 32bit thông tin vì Mentalrays được cài đặt mặc định là render với định dạng 16bit. Bây giờ, bạn hãy tự mình tạo ra một khung cảnh và thử áp dụng phương pháp này xem sao.

Tôi khuyên bạn sử dụng kiểu file EXR để lưu trữ bức hình ở định dạng 32bits dữ liệu mỗi kênh. Ghi chú rằng Photoshop sẽ không làm việc thực sự tốt với loại file này, nhưng hầu hết các phần mềm composition khác thì có. Tôi sẽ sử dụng After effects trong trường hợp này.

*

Chắc chắn rằng bạn thiết lập project về 32bit dữ liệu mỗi kênh, để đảm bảo rằng After effects sẽ nhận được đầy đủ tất cả các thông tin từ bức hình.

Khi tại một ảnh 32bit hoặc ảnh EXR vào After effects, After effects sẽ cho rằng bức ảnh ở dạng không gian màu tuyến tính, và do đó sẽ tự động xử lý bức hình theo cách đó.

Nếu bạn tiến hành các bước một cách chính xác, bức hình sẽ được hiển thị đúng trong AE. Kể cả nếu bức hình chưa được hiệu chỉnh gamma, AE cũng sẽ đảm bảo việc hiển thị đúng khi hoàn tất. Khi xuất dữ liệu, dưới dạng movie hoặc hình ảnh, AE sẽ đảm bảo đầu ra được hiệu chỉnh gamma đúng khi được lưu.

Nếu bạn sử dụng các passes khác như reflection pass, bạn nên sử dụng chế độ blending mode là: Add. Vì project ở trong không gian làm việc tuyến tính nên, việc tính toán sẽ được thực hiện chính xác. Chế độ blending mode Screen, là một “chế độ giả” khi cố mô phỏng theo thuật toán dành cho các bức hình không tuyến tính. Vẫn còn một vấn đề với thiết lập này khi sử dụng Vray. Vì vRay mang tính thích nghi rất cao khi rendering, đồng nghĩa với việc tại những vùng tối, Vray sẽ không sử dụng các mẫu quá cao. Hệ thống này gọi là vRay DMC sampling (Deterministic Monte Carlo). Vấn đề với thiết lập này là khi vRay cố tìm ra độ sáng của một vùng nào đó, nó sẽ không nhận được giá trị chính xác vì vRay đang nhìn vào bức hình đã được hiệu chỉnh gamma để quyết định điều này.

*

Và đây là một ví dụ cho thấy kết quả khi vRay không nhận được các giá trị đúng mà nó tìm kiếm. Chú ý độ nhiễu ở một số khu vực, kể cả khi chúng khá sáng và được lấy mẫu tốt hơn:

*

Đó là do V-Ray nhìn vào bức hình này khi quyết định độ sáng của mỗi pixel. Để sửa lỗi này, cần điều chỉnh lại một số thứ. Đầu tiên, bạn cần báo cho V-Ray biết rằng nó đang làm việc với môi trường không gian tuyến tính. vRay khá lạc hậu trong phần thiết lập gamma, do đó bạn có thể thực hiện điều này bằng cách thiết lập thông số sau bằng 2,2. Vào kích hoạt tùy chọn “Don’t affect colors (adaptation only)”. Với phiên bản 3.0 thì tùy chọn mode là “color mapping and gamma”

*

Ghi chú rằng, tôi không kích hoạt tùy chọn “Linear workingflow” ở đây vì đây là một phương pháp đã cũ và bạn không cần để ý đến nó.

Lúc này bộ vRay DMC sampler đã nhận được các giá trị đúng mà chúng cần tìm.

Xem thêm: Shoes Game Là Gì – Buy Mens Nike Air Force 1 Mid Bred 315123

Bạn có thể xem kết quả trước và sau khi hiệu chỉnh:

*

Vấn đề về Gamma và linear workspace luôn là một chủ đề lớn và được thảo luận nhiều. Hy vọng là bài viết này sẽ giúp ích được phần nào cho các bạn. Cám ơn vì đã xem qua nó.

Tham khảo từ các bài viết của các tác giả: johanseazo,Charles Poyton, và Martin Breid