1 อธิบาย
RGB (1, 0, 0) ไม่ได้บอกว่าแดงแค่ไหน ต้องรู้ว่าอยู่ในพื้นที่สีไหน สามเหลี่ยมแต่ละอันคือขอบเขตสีที่พื้นที่สีนั้นแทนได้ ACEScg กว้างกว่า sRGB มาก
ถ้าเอาภาพ sRGB เข้า comp ที่เป็น ACEScg ต้องแปลง primaries ด้วย ไม่ใช่แค่ gamma การตั้งค่าเริ่มต้นบางแบบแปลงแค่ gamma สีจะอิ่มผิด
2 ลงมือลอง
ลองเลือก ACEScg แล้วดัน g สูง r กับ b ต่ำ
3 เจาะลึก
Primaries + white point = ความหมายของ RGB
พื้นที่สีหนึ่งประกอบด้วยสามอย่าง: primaries สามสี, white point และเส้นโค้ง (transfer function) สองไฟล์ที่มีตัวเลขเหมือนกันอาจเป็นคนละสี ถ้าอย่างใดอย่างหนึ่งในสามอย่างนี้ต่างกัน
| พื้นที่สี | primaries | white | เส้นโค้ง | ใช้กับ |
|---|---|---|---|---|
| sRGB | Rec.709 | D65 | sRGB | texture, เว็บ, จอคอม |
| Rec.709 | Rec.709 | D65 | Rec.709 (จอ BT.1886) | วิดีโอ HD |
| Display P3 | P3 | D65 | แบบ sRGB | จอ wide gamut |
| ACEScg | AP1 | ≈ D60 | linear | working space ของ CG/comp |
| ARRI LogC3 | ARRI Wide Gamut 3 | D65 | LogC3 | ฟุตเทจกล้อง Alexa |
แดงเดิม ตัวเลขใหม่
แดงสุดของ sRGB (1, 0, 0) เมื่อแปลงเป็น ACEScg ได้ราว (0.613, 0.070, 0.021) เพราะ primaries ของ ACEScg กว้างกว่า แดงของ sRGB จึงต้องใช้แดงของ AP1 น้อยลงและผสมเขียวกับน้ำเงินนิดหน่อย
สี neutral ไม่เปลี่ยน: ขาว (1, 1, 1) และเทา 0.18 ยังเป็นค่าเดิม เพราะการแปลงปรับ white point ให้ด้วย (chromatic adaptation) ทางกลับกัน เขียวสุดของ ACEScg (0, 1, 0) ใน sRGB ได้ราว (−0.62, 1.14, −0.13)
ค่าติดลบ = สีที่อยู่นอกสามเหลี่ยม
ค่าติดลบหลังแปลงพื้นที่สีไม่ใช่พิกเซลเสีย มันคือสีที่พื้นที่ปลายทางแทนไม่ได้ เจอบ่อยกับไฟ LED, นีออน, ประกายไฟอิ่มจัด และ blue/green screen
ปัญหาคือหลาย node ไม่ชอบค่าติดลบ เช่น keyer, divide, การแปลงเป็น log และ gamma (ใน Nuke gamma ของค่าติดลบให้ 0) แต่การ clamp ทิ้งเฉย ๆ ทำให้เฉดสีเพี้ยน วิธีแก้ขึ้นกับ pipeline เช่นบางโชว์ใช้ gamut compression
มองไม่เห็นบนจอ sRGB ให้หาด้วย Expression ที่ใส่ r<0||g<0||b<0 ลง alpha (ดู C9)
อะไรต้องแปลง อะไรห้ามแปลง
ภาพที่เป็น “สี” ต้องแปลงทั้งเส้นโค้งและ primaries ส่วนภาพที่เป็น “ข้อมูล” ต้องเข้ามาแบบดิบ ไม่แปลงเลย ไม่งั้นตัวเลขที่ใช้คำนวณจะเพี้ยน
| ภาพ | แปลงไหม |
|---|---|
| texture สี, albedo, โลโก้, stock ประกายไฟ sRGB | แปลง: เส้นโค้ง + primaries |
| HDRI (linear, primaries sRGB) | แปลง: primaries |
| normal, depth, motion vector, position | ห้าม (raw) |
| roughness, mask, alpha, ID matte | ห้าม (raw) |
4 ในงานจริง
ทำใน Nuke
- Color management แบบ Nuke เปลี่ยนแค่เส้นโค้ง ไม่แปลง primaries plate LogC ที่อ่านเป็น AlexaV3LogC จึงยังอยู่ใน primaries ของ ARRI Wide Gamut
- ถ้าต้องแปลง primaries ในโหมดนั้น ใช้ Colorspace node (ส่วน primaries) หรือเปลี่ยนไปใช้ OCIO
- ใน OCIO เช่น config ACES ตัวเลือกใน Read จะแปลงทั้งเส้นโค้งและ primaries เข้า working space (เช่น ACEScg)
- OCIOColorSpace: แปลง element เดี่ยว ๆ เช่น stock ประกายไฟ sRGB เข้า ACEScg
- Pass ข้อมูล (normal, depth, motion): ติ๊ก raw data ที่ Read เพื่อไม่ให้ถูกแปลง
พลาดบ่อย → แก้ยังไง
- ✗ แปลงแค่ gamma ให้ PNG sRGB ก่อนเข้า comp ที่เป็น ACEScg หรือ ARRI Wide Gamut✓ แปลง primaries ด้วย ไม่งั้นสีอิ่มเกินและเฉดเพี้ยน
- ✗ แปลงพื้นที่สีให้ normal หรือ depth pass✓ ข้อมูลต้องเป็น raw relight และ defocus ถึงจะถูก
- ✗ Clamp ค่าติดลบที่ 0 ทั้งภาพโดยไม่คิด✓ ถาม pipeline ก่อน บางโชว์ใช้ gamut compression ถ้าต้อง clamp ให้ทำเฉพาะจุดที่มีปัญหา
- ✗ “บนจอเราดูดีแล้ว” จึงไม่เช็ก gamut✓ จอ sRGB ซ่อนสีนอก gamut ไว้ ตรวจค่าติดลบหรือลด saturation ดูความต่าง
เช็กก่อนส่งช็อต
- ทุก element สีถูกแปลงทั้งเส้นโค้งและ primaries เข้า working space
- Pass ข้อมูลทั้งหมดเข้ามาแบบ raw
- ตรวจค่าติดลบในจุดสีอิ่ม (LED, ไฟ, screen)
- รู้ว่าโชว์ใช้ config และ working space อะไร
5 เช็กตัวเอง
เอา texture sRGB เข้า comp ACEScg ต้องทำอะไร
🔒 ตอบคำถามด้านบนก่อน แล้วการ์ดนี้จะเปิด
1. แดง sRGB (1, 0, 0) แปลงเป็น ACEScg ได้ราว (0.61, 0.07, 0.02) เพราะอะไร
2. แปลง render ACEScg เป็น sRGB แล้วแสงเลเซอร์สีเขียวมีค่าแดงติดลบ แปลว่าอะไร
ตัวเลขมาจากไหน: เส้นโค้งและเมทริกซ์คำนวณจากนิยามที่เผยแพร่ (sRGB IEC 61966-2-1, ARRI LogC3 EI 800, primaries ของ Rec.709/P3/Rec.2020/ACES AP1) ตรวจกับตัวเลขอ้างอิงที่เผยแพร่แล้ว ส่วน tone curve เป็นสูตรตัวอย่าง ไม่ใช่ ACES/AgX/Filmic