anh sang gama
TRANSCRIPT
Linear Workflow: Gamma 2.2 trong VRay – Bí quyết thành công !binlatAugust 26, 2012Kỹ thuật No Comments
Linear Workflow: Hướng dẫn đầy đủ
LWF – Linear Workflow… rất nhiều người bàn về LWF trên rất nhiều diễn đàn, cũng có nhiều bài hướng
dẫn, trùng nhau cũng có và xung đột nhau cũng có. Bài viết này là 1 bài hướng dẫn tổng hợp và đúc
kết từ nhiều cách làm và cũng không phải là cách duy nhất hay nhất về LWF nhưng tôi tin rằng đây là
một bài hướng dẫn có ích và dễ hiểu nhất về LWF mà các bạn từng biết, đặc biệt là các bạn
mới tìm hiểu LWF.
VẬY LINEAR WORKFLOW LÀ GÌ ?
Hãy nhìn 2 bức ảnh trên xem có gì khác nhau ? Thực ra nó chẳng khác gì nhau cả, chỉ khác nhau về
cách hiển thị của Monitor thôi ^^.
Vray và 3dsMax xử lí dữ liệu của một bức ảnh trong một môi trường không gian tuyến tính, còn được
gọi là Gamma 1.0, nhưng hầu hết các loại màn hình lại mặc định hiển thị cho bạn hình ảnh với Gamma
2.2 (sRGB), mà về cơ bản thì nó làm cho hình ảnh cảm giác bị tối đi mặc dù thực sự không phải chỗ
nào cũng tối. Quá trình xử lý này giả định rằng bạn đang xem hình ảnh ở Gamma 1.0 thay vì 2.2, trừ
khi bạn khai báo kiểu khác.
Thật không may đây cũng là một vấn đề của 3D, có nghĩa là rất nhiều ” nghệ sĩ ” không biết về LWF đã
mất nhiều thời gian để dàn dựng một cách thủ công nhằm cố gắng có được kết quả render thực nhất.
Những thứ như bổ sung thêm đèn chiếu sáng nhiều hơn, tăng cường độ ánh sáng môi trường / tăng nảy
bật GI, thêm một số đèn chiếu sáng xung quanh nhưng tắt bóng đổ vv vv tất cả những điều đó đã làm
tăng thời gian tính toán và làm sai lệch ánh sáng thực tế cần có của 1 khung cảnh…Và bây giờ chúng
ta đang nghiên cứu để khắc phục những vấn đề đó đây ! ^^
Vậy các bạn đã hình dung được LWF là gì rồi chứ ! Chẳng có gì gọi là đao to búa lớn để tốn nhiều giấy
mực, chẳng có gì để phải khư khư giấu nghề. Nói 1 cách dễ hiểu nhất: chẳng quá nó chỉ là cách khai
báo để màn hình hiển thị cho đúng mà thôi !
Bước 1: THIẾT LẬP TRONG 3DS MAX
TEXTURES và MATERIALS cũng cần phải được chuyển đổi sang Gamma 2.2. Nên lưu ý rằng bạn có thể
dùng LWF mà không cần thiết lập đồng bộ tất cả các thông số, nhưng bạn sẽ rất khổ sở để điều chỉnh
chính xác vật liệu bạn cần.
Vào cutomize/preferences/Gamma and LUT. Thay đổi setting như hình dưới.
+ Enable Gamma/LUT Correction : Bật tính năng dùng gamma correction trong 3ds Max. Khi
bật chức năng này ta mới có thể hiệu chỉnh các giá trị gamma cho ảnh map đầu vào và ảnh render khi
save ra.
+ Gamma: 2.2.Gamma correct sẽ sử dụng giá trị này cho ảnh render. Giá trị này không có tác dụng
với Vray frame buffer khi chưa kiểm sRGB
+ Affect Color Selectors : Đồng bộ giá trị gamma với bảng màu của 3ds max, các bạn sẽ thấy bảng
màu mới có nhiều giá trị xám hơn (hay có thể nói các giá trị cận trắng sẽ nhiều hơn).
+Affect Material Editor : Đồng bộ giá trị gamma với bảng vật liệu của 3dsmax, các bạn sẽ thấy các
ô vật liệu có vẻ sáng hơn
+ Input Gamma: 2.2 Gamma mặc định dùng cho ảnh map đầu vào.
+Output gamma): Sau khi gamma correct, ảnh render xong được save thành file vào ổ cứng. Giá trị
này set bằng 1.0 khi dùng với VRay frame buffer.
MAP ĐẦU VÀO:
Hầu hết các hình ảnh bạn tìm thấy trên Internet hoặc từ máy ảnh kỹ thuật số của bạn sẽ được chuyển
sRGB (gamma 2.2) để dễ dàng hơn trong quá trình giả lập (chuyển đổi ngay từ đầu). Một số tập tin là
hữu tuyến tính (như HDRIs) sẽ không yêu cầu điều chỉnh đến 2,2, ảnh normal maps hay displacement
cũng vậy vì nó sẽ không làm việc đúng cách. Đối với những loại ảnh này điều tốt nhất là để Gamma
theo từng trường hợp khi import vào scene của bạn (xem hình dưới đây). Tức là khi input bạn có thể
override tùy ý miễn sao sắc độ ảnh đầu vào theo cảm nhận của bạn là tốt – giá trị override
càng cao thì ảnh sẽ càng tối. Đối với thư viện merger vào thì map sẽ tự dịch theo giá trị input.
Vậy là đã thiết lập xong Gamma 2.2 trong 3dsmax, giờ chúng ta thiết lập trong bảng setting vray và
render với VRay Frame Buffer.
Từ bước tiếp theo sẽ chia 2 cách:
BƯỚC 2 (cách 01): SETTING VRAY
Vào VRay’s ‘Color Mapping’ điều chỉnh Gamma thành 2.2 (giá trị này ảnh hưởng tới độ sáng của
ảnh ở VRay frame buffer cả khi chưa kích hoạt và đã kích hoạt sRGB. Nó sẽ nhân với giá trị gamma
ouput khi ta save ảnh nên 2.2×1=2.2 là kết quả đúng).Kiểm ‘Don’t affect colours (adaption only)’
(Giá trị gamma của color mapping không ảnh hưởng tới màu sắc, chỉ ảnh hướng tới quá trình tính toán
khử noise)
Bạn có thể dùng bất cứ Type nào trong color mapping khi sử dụng gamma 2.2. Linear trong type chỉ là
tên 1 thuật toán tone mapping không phải nguồn gốc tên Linear work flow (LWF)
Tác dụng khi kiểm vào ‘Don’t affect colours (adaption only)’ là Gamma 2.2 sẽ không làm sáng ảnh cuối
cùng, tuy nhiên V-Ray sẽ tiến hành tính toán như khi được làm sáng. Hiệu ứng này làm cho Vray tính
toán khử noise tốt hơn bởi vì nó tính toán một khung cảnh sáng hơn, do đó các hình ảnh trong tối và
ngoài sáng rõ ràng hơn. Nếu không kiểm nó tôi nghĩ rằng nhiều bạn sẽ kêu trời lên ” Ôi tại sao dùng
2.2 ảnh lại bạc thế, quay về 1.0 thôi ! “.
Bước 3 (cách 01): VRAY FRAME BUFFER
Những hình ảnh bạn lưu ra vẫn còn ở dạng tuyến tính (Linear) dễ dàng điều chỉnh với VFB.
Vray Frame Buffer không bị ảnh hưởng bởi các thiết lập gamma của 3dsmax ở bước 1 nên ảnh render
có thể trông vẫn rất tối.Bạn sẽ phải click vào nút sRGB ở dưới khung hình để cho nó sáng lên đúng
với giá trị gamma khai báo trong Gamma ở bước 1. Lưu ý rằng đây chỉ là cách hiển thị chứ ảnh vẫn ở
dạng tuyến tính.
Như các bạn thấy, hình ảnh đã đươc hiển thị ở Gamma 2.2 và vẫn còn có thể điều chỉnh được với Vray
Frame buffer.
Bạn thấy đấy, khung cảnh sáng lên ở mọi góc mà ko cần phải tăng cường đèn cũng như tăng các thông
số nảy bật lên 1 cách thái quá khiến khung cảnh không được tự nhiên. Bạn cũng sẽ nhận thấy rằng
hình ảnh không rực như trước. Cơ bản là bởi vì khi bạn muốn làm sáng các vùng tối bằng cách bổ sung
thêm đèn chiếu sáng nó cũng tăng sáng ở vùng ánh sáng, vì vậy mà nó sẽ bị vượt quá màu trắng tinh
khiết (255, 255, 255), tức là bị cháy.
Bước 4 (cách 01): SAVE ẢNH, ĐỊNH DẠNG FILE VÀ RENDERING:
Save ảnh với giá trị override là 2.2
Khi save ảnh tuyến tính, ở định dạng 8 bit sẽ rất tốt ở 1 số dải màu tuy nhiên sẽ không đủ cho toàn bộ
bức ảnh. Bất cứ khi nào có thể hãy save nó ở dạng 16 hoặc 32 bit
Đừng bao giờ save ở dạng JPEG với ảnh tuyến tính bởi vì nó sẽ bỏ qua 1 số mã ảnh cần thiết khi dịch
gamma.
BƯỚC 2 (cách 02): SETTING VRAY
Vào VRay’s ‘Color Mapping’ điều chỉnh Gamma thành 2.2 (giá trị này ảnh hưởng tới độ sáng của
ảnh ở VRay frame buffer cả khi chưa kích hoạt và đã kích hoạt sRGB. Nó sẽ nhân với giá trị gamma
ouput khi ta save ảnh nên 2.2×1=2.2 là kết quả đúng).Không kiểm ‘Don’t affect colours
(adaption only) để giữ nguyên tác dụng của color mapping, bạn có thể sử dụng bất cứ thuật toán
color mapping nào mình muốn.
Bước 3 (cách 02): VRAY FRAME BUFFER
Không click vào nút sRGB ở dưới khung hình để ảnh không bị sáng lên vì đã sử dụng gamma 2.2
trong color mapping, nếu kiểm sRGB nữa thì ảnh sẽ bị thừa gamma (2 lần 2.2).
Bước 4 (cách 02): SAVE ẢNH, ĐỊNH DẠNG FILE VÀ RENDERING:
Save ảnh với giá trị override là 1.0
Chú giải bổ sung :
- Ảnh render ra sẽ có gamma = 1.0 và sẽ hiển thị ở gamma = 2.2, do đó bị tối đi (gamma và độ sáng là
ngược nhau: gamma lớn hơn 1 sẽ làm hình tối đi và gamma nhỏ hơn 1 sẽ làm hình sáng lên). Vì vậy
chúng ta gamma correct bằng cách làm sáng ảnh lên với gamma nghịch đảo của 2.2 (tức là 1 chia 2.2
= 0.45454).
Trong 3ds Max chúng ta khai báo gamma = 2.2 để nói rằng hình render sẽ được hiển thị với màn hình
có gamma 2.2. Nhưng giá trị gamma thực sự mà V-Ray dùng để gamma correct ảnh render là 1 / 2.2 =
0.4545
Các thắc mắc thường thấy trong quá trình sử dụngHỏi: Dùng gamma 2.2 thì settings ánh sáng và vật liệu có khác gamma 1.0 không ?
Trả lời: Nếu dùng gamma 2.2 thì settings ánh sáng và vật liệu sẽ khác gamma 1.0. Dải màu tối sẽ bị
ngắn đi nên cường độ ánh sáng và giá trị vật liệu cũng có xu hướng setting thấp hơn.
Hỏi: Khi sử dụng LWF ta thay đổi type của color mapping sang exponential thì độ sáng có
thay đổi không ?
Trả lời: Bạn có thể dùng bất cứ Type color mapping nào với LWF, ko nhất thiết phải dùng Linear. Khi
thay đổi TYPE thì ảnh được tone theo cách khác nhau nên sẽ có độ tương phản và rực màu khác nhau.
Cụ thể exponential sẽ khống chế các vùng ảnh quá sáng hay quá tối về giá trị dải màu 0-255 để ảnh
không bị cháy.
Hỏi: Khi merger object từ thư viện vào thì map sẽ chuyển thành gamma 2.2 hay vẫn giữ
gamma 1.0 ?
Trả lời: Khi merger object từ thư viện vào thì map sẽ được correct theo giá trị Gamma input nếu ảnh
gốc đã được thiết lập USE SYSTEM GAMMA. Điều này phụ thuộc vào người làm thư viện, nếu ảnh gốc
đã được override 1 giá trị gamma nào đó rồi thì nó sẽ được giữ nguyên khi merger.
(LÊ ANH TUẤN – WWW.VIETCG.COM – www.hoc3d.vn biên tập và bổ sung từ David Fleet)
Các thắc mắc thường thấy trong quá trình sử dụngHỏi: Dùng gamma 2.2 thì settings ánh sáng và vật liệu có khác gamma 1.0 không ?
Trả lời: Nếu dùng gamma 2.2 thì settings ánh sáng và vật liệu sẽ khác gamma 1.0. Dải màu tối sẽ bị
ngắn đi nên cường độ ánh sáng và giá trị vật liệu cũng có xu hướng setting thấp hơn.
Hỏi: Khi sử dụng LWF ta thay đổi type của color mapping sang exponential thì độ sáng có
thay đổi không ?
Trả lời: Bạn có thể dùng bất cứ Type color mapping nào với LWF, ko nhất thiết phải dùng Linear. Khi
thay đổi TYPE thì ảnh được tone theo cách khác nhau nên sẽ có độ tương phản và rực màu khác nhau.
Cụ thể exponential sẽ khống chế các vùng ảnh quá sáng hay quá tối về giá trị dải màu 0-255 để ảnh
không bị cháy.
Hỏi: Khi merger object từ thư viện vào thì map sẽ chuyển thành gamma 2.2 hay vẫn giữ
gamma 1.0 ?
Trả lời: Khi merger object từ thư viện vào thì map sẽ được correct theo giá trị Gamma input nếu ảnh
gốc đã được thiết lập USE SYSTEM GAMMA. Điều này phụ thuộc vào người làm thư viện, nếu ảnh gốc
đã được override 1 giá trị gamma nào đó rồi thì nó sẽ được giữ nguyên khi merger.
(LÊ ANH TUẤN – WWW.VIETCG.COM – www.hoc3d.vn biên tập và bổ sung từ David Fleet)
Các chú giải thêm về lý do các thiết lập và bản chất của vấn đề:
Về lý do tại sao màn hình được thiết kế với gamma 2.2Dưới đây mình xin giải thích vì sao màn hình có gamma = 2.2 và vì sao chúng ta phải thực hiện color
correction:
Hãy giả sử màn hình máy tính của chúng ta là màn hình trắng xám đen, không có sắc, chỉ có cường độ
sáng tối.
Cường độ tối nhất là màu đen, có giá trị là 0,0
Cường độ sáng nhất là mày trắng (trắng tuyệt đối), có giá trị là 1,0
Các giá trị ở giữa 0,0 và 1,0 là các màu xám. Giá trị càng lớn thì càng sáng, ví dụ màu xám 0.6 sẽ sáng
gấp đôi màu xám 0.3
Dải màu đen – xám – trắng ở trên là một dải màu liên tục (hình 1)
Hình 1
Tuy nhiên trong máy tính chúng ta không thể thể hiện dải màu này một cách liên tuc mà phải chia ra
các bậc thang (hình 2)
Hình 2
Dùng càng nhiều bậc thì sự chuyển màu sẽ càng mịn. Vậy chúng ta cần số lượng bậc vừa đủ để đảm
bảo sự mịn màng này và tránh hiện tượng “vân gỗ” (banding). Nhưng nếu chọn nhiều bậc quá thì sẽ
tốn memory. Ở hình 2, chúng ta có thể nhận thấy hiện tượng “vân gỗ” banding do hình này chỉ dùng
32 bậc màu.
Trên thực tế, người ta dùng 256 bậc để thể hiện dải màu đen-xám-trắng. Các bậc này được đánh số
thự tự 0, 1, 2, 3, …., 255. Tuy nhiên, 256 bậc này được phân bố như thế nào trên dải màu? Cách phân
bố hiển nhiên nhất là phân bố đều: chúng ta cứ việc chia dải mày ra 256 bậc thang đều nhau. Có nghĩa
là:
- Bậc số 0 ứng với giá trị 0,0 (màu đen)
- Bậc số 1 ứng với giá trị 1,0 (màu trắng tuyệt đối)
- Bậc số 128 ứng với giá trị 0,5 (màu xám “giữa”, tiếng Anh gọi là mid-grey)
Đây là cách phân bố linear (tuyến tính). Sở dĩ gọi là tuyến tính (thẳng) là vì nếu vẽ biểu đồ thể hiện giá
trị màu của mỗi bậc thang, chúng ta sẽ có một biểu đồ đường thẳng (Hình 3)
Hình 3
Tuy nhiên nếu chỉ dùng 256 bậc và phân bố đều như trên thì không đủ để đảm bảo sự chuyển màu mịn
màng ở những vùng tối (chúng ta có thể phần nào quan sát thấy hiện tượng này ở hình 2, ở đây chúng
ta thấy khu vực sáng có sự chuyển tiếp màu một cách mịn màng hơn khu vực tối)
Tại sao lại như vậy? Tại sao chỉ có vùng tối là bị hiện tượng banding, còn vùng sáng thì vẫn mịn. Lý do
là vì trong điều kiện ánh sáng tối, mắt người nhạy với sự thay đổi ánh sáng hơn. Ví dụ: khi cúp điện vào
ban đêm, nếu thắp 1 ngọn nến lên chúng ta sẽ dễ dàng phát hiện ra ngọn nến đó, vì nó quá nổi bật
giữa màng đêm. Tuy nhiên giữa ban ngày trời sáng, nếu thắp nến thì ánh sáng của ngọn nến ít gây chú
ý hơn. Chính vì vậy mà khi xem phim hay trong rạp cinema, người ta tắt hết đèn đi đển mắt người có
thể nhận biết độ tương phản trên màn hình một cách tốt nhất.
Để tránh hiện tượng banding ở vùng tối, chúng ta có thể dùng nhiều hơn 256 bậc, nhưng làm vậy sẽ
tốn memory. Nếu dùng 256 bậc, thì chúng ta chỉ tốn 1 byte của memory để thể hiện giá trị màu của 1
pixel. 1 byte là rất lý tưởng.
Vậy nếu không tăng số lượng bậc thang lên cao hơn 256, chúng ta có thể thay đổi cách phân bố các
bậc thang. Thay vì chúng ta phân bố đều như trên, thì chúng ta phân bố không đều: ưu tiên nhiều bậc
thang hơn cho vùng tối, và ít bậc thang hơn cho vùng sáng. Cách phân bố này gọi là phân bố gamma,
và được dưa trên phép toán luỹ thừa. Trên thực tế, cách này sẽ cho kết quả dải màu mịn, không bị
banding mà vẫn chỉ dùng 256 bậc thang.
Vậy nếu vẽ biểu đồ thể hiện giá trị màu của mội bậc thang, chúng ta sẽ có kết quả như hình 4.
Hình 4
Quan sát biểu đổ trên, chúng ta thấy cách phân bố gamma ưu tiên nhiều bậc thang để thể hiện các giá
trị màu tối hơn là sáng.
Để biết được bậc thứ n có giá trị màu là bao nhiêu trong cách phân bố gamma. Chúng ta trước hết tính
xem là nếu dùng phương án phân bố đều, n sẽ cho giá trị màu là bao nhiêu, sau đó chúng ta luỹ thừa
giá trị màu này lên gamma.
Ví dụ, bậc số 128 sẽ cho giá trị màu 0.5 nếu sử dụng phương án phân bố đều. Khi luỹ thừa lên gamma
= 2.2, chúng ta sẽ có giá trị khoảng 0.22, đây chính là giá trị khi dùng cách phân bố gamma.
Vậy ví dụ như trong photoshop chúng ta tô một pixel với giá trị màu 128, thì pixel đó chỉ phát ra ánh
sáng với cường độ 22% của với mức maximum mà màn hình cho phép. Kết quả này là theo hệ phân bố
gamma 2.2 của màn hình. Nếu giả sử màn hình sử dụng phân bố đều (còn gọi là gamma 1.0), thì màn
hình sẽ phát ra độ sáng là 50% của mức mamximum mà màn hình cho phép.
Giá trị gamma không nhất thiết là 2.2. Vi dụ màn hình của Apple lúc trước hay dùng gamma = 1.8.
Nhưng giờ đây hình cũng chuyển sang dùng 2.2. Và 2.2 được xem là mức gamma chuẩn khi dùng
linear workflow.
Vậy chúng ta đã hiểu bản chất gamma 2.2 của màn hình. Tiếp đến chúng ta xét đến V-Ray.
V-Ray cho kết quả render theo gamma 1.0 (bậc thang phân bố đều). Nghĩa là nếu V-Ray render một
bức hình nội thất mà trong đó bức tường có bậc màu là 150, và sàn nhà có bậc màu la 75 thì đáng lẽ là
khi nhìn vào bức hình render này, mắt chúng ta phải cảm thấy tường sáng gấp đôi sàn nhà (vì 150 lớn
gấp đôi 75), nhưng vì màn hình hiển thị màu ở gamma 2.2, nên 150 sẽ không còn sáng gấp đôi 75 nữa.
Vì vậy chúng ta phải triệt tiêu tính chất gamma 2.2 của màn hình. bằng cách biến hình render từ
gamma 1.0 thành gamma 0.45 trước khi hiển thị. Gamma 0.45 và gamma 2.2 triệt tiêu nhau, cho kết
qua gamma 1.0 mà chúng ta muốn.
Ví dụ: Vray render ra bức tường có giá trị ở bậc 128. Bậc 128 này là bậc ở ngay chính giữa của thang
màu gồm 256 bậc. Vì vậy chúng ta muốn các pixel của bức tường này có giá trị 0.5 khi hiển thị ra màn
hình (tức là các pixel sẽ phát ra độ sáng ở mức 50% so với mức maximum mà màn hình cho phép). Vậy
chúng ta sẽ luỹ thừa 0.5 với gia trị gamma = 0.454545, sẽ được giá trị là 0.73 (ứng với bậc thang số
186 của cách phân bố đều). Khi hiện thị ra màn hình với gamma 2.2, bậc thang số 186 sẽ cho giá trị
màu của pixel là 0.5 (như trong biểu đồ ở hình 4), đây chính là kết quả mà chúng ta muốn.
Vậy chúng ta có thể thấy gamma correction trong V-Ray là để trừ hao cho sự khác biết giữa gamma
1.0 của V-Ray và gamma 2.2 của màn hình máy tính.
Về Việc không cần gamma correct các ảnh map dạng trắng đen (bump, specular, glossiness, alpha)Theo tiêu chuẩn thì các ảnh map trắng đen đều được save ở hệ màu tuyến tính chứ không phải sRGB,
vì vậy nếu correct các ảnh này khi import vào 3ds max thì sẽ sai với ý đồ cua người thiết kế ra các ảnh
này.
Các bạn có thể thử open các hình này trong photoshop, và kiểm tra color profile của nó để thấy là color
profile của nó là Dot Gain (là một profile tuyến tính) chứ không phải là sRGB.
Vì vậy, khi load các ảnh bump hay specular vào trong max, phải dùng override gamma với giá trị 1.0
(hoặc chọn là “use image gamma”)
Dĩ nhiên là nếu người thiết kế thư viên ảnh bump cố ý save các ảnh đó ở sRGB thì vẫn cần phải correct
khi load vào mad. Nhưng theo tiêu chuẩn save ảnh map thì ít ai làm vậy.
Lý dó mà chỉ có diffuse map (và environment map dạng Low dynamic range) phải cần sRGB, là vì
những hình này sẽ đùng để hiển thị truc tiếp ra màn hình, vì vậy cần sRGB để hạn chế banding. Còn
bump, discplainemnt và specular không phải là các ảnh dùng để hiển thị trực tiếp rà màn hình, mà
dùng đề tính toán độ cao thấp, độ phản xạ của bề mắt vật liệu, vì vậy không cần bận tâm đến chuyện
banding
Khi load HDRI bằng công cụ load của VRayHDRI thì nó tự động hiểu là 1.0. Chỉ khi load theo browser
của 3ds max thì mới phải override gamma 1.0 (hoặc chọn là “use image gamma”)
(NGUYỄN PHƯỚC LONG – WWW.VIETCG.COM – www.hoc3d.vn )