หน้าแรก · Lab · Color

C5 Gamut: ตัวเลขเดียวกัน สีต่างกัน

sRGB, P3, Rec.2020, ACEScg บนแผนภาพเดียว

Color · ~7 นาที · ฟรี

1 อธิบาย

RGB (1, 0, 0) ไม่ได้บอกว่าแดงแค่ไหน ต้องรู้ว่าอยู่ในพื้นที่สีไหน สามเหลี่ยมแต่ละอันคือขอบเขตสีที่พื้นที่สีนั้นแทนได้ ACEScg กว้างกว่า sRGB มาก

ถ้าเอาภาพ sRGB เข้า comp ที่เป็น ACEScg ต้องแปลง primaries ด้วย ไม่ใช่แค่ gamma การตั้งค่าเริ่มต้นบางแบบแปลงแค่ gamma สีจะอิ่มผิด

2 ลงมือลอง

ลองเลือก ACEScg แล้วดัน g สูง r กับ b ต่ำ

SkyVFX Lab · C5interactive · 1001

3 เจาะลึก

Primaries + white point = ความหมายของ RGB

พื้นที่สีหนึ่งประกอบด้วยสามอย่าง: primaries สามสี, white point และเส้นโค้ง (transfer function) สองไฟล์ที่มีตัวเลขเหมือนกันอาจเป็นคนละสี ถ้าอย่างใดอย่างหนึ่งในสามอย่างนี้ต่างกัน

พื้นที่สีprimarieswhiteเส้นโค้งใช้กับ
sRGBRec.709D65sRGBtexture, เว็บ, จอคอม
Rec.709Rec.709D65Rec.709 (จอ BT.1886)วิดีโอ HD
Display P3P3D65แบบ sRGBจอ wide gamut
ACEScgAP1≈ D60linearworking space ของ CG/comp
ARRI LogC3ARRI Wide Gamut 3D65LogC3ฟุตเทจกล้อง 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

  1. Color management แบบ Nuke เปลี่ยนแค่เส้นโค้ง ไม่แปลง primaries plate LogC ที่อ่านเป็น AlexaV3LogC จึงยังอยู่ใน primaries ของ ARRI Wide Gamut
  2. ถ้าต้องแปลง primaries ในโหมดนั้น ใช้ Colorspace node (ส่วน primaries) หรือเปลี่ยนไปใช้ OCIO
  3. ใน OCIO เช่น config ACES ตัวเลือกใน Read จะแปลงทั้งเส้นโค้งและ primaries เข้า working space (เช่น ACEScg)
  4. OCIOColorSpace: แปลง element เดี่ยว ๆ เช่น stock ประกายไฟ sRGB เข้า ACEScg
  5. 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 เช็กตัวเอง

เช็กตัวเอง 1 ข้อ

เอา 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