2012年11月23日 星期五
2012年11月17日 星期六
那” 直線性色彩工作法 / Linear Workflow ”的背後有哪些你應該要知道?????????
首先你被你的眼睛騙了一輩子! What??
真實世界其實還蠻暗的(gamma 1.0) ! 但我們看世界還好呢??
因為我們人類的眼睛內建一種看東西的上揚曲線叫Gamma
0.4545
所以
Another Sample:
然後如果我再告訴你另外一個事實:
所有的數位相機/錄影機在拍攝影像時, CCD或CMOS等感光元件所看到接受到是直線性色彩但在寫入檔案到記憶卡或磁碟磁帶過程中會加入一個gamma 0.4545曲線
Another Sample:
你可能會問, Why?????? 那我先問你是否有聽過螢幕gamma
2.2或1.8
(Apple螢幕)??
因為我們的任何一個螢幕都帶著一種把畫面弄暗的gamma 2.2曲線
所以:
Another Sample:
其實gamma 0.4545剛好是螢幕gamma
2.2的反函數(1/2.2=0.4545),
所以被gamma0.4545拉亮的數位檔案剛好被螢幕的gamma2.2中和掉而獲得最後gamma1.0的輸出影像,
符合物理世界的呈現模式!
再加上人類用gamma
0.4545的肉眼曲線看亮世界, 所以螢幕所呈現在人眼所看到的結果自然沒有甚麼問題!!
殊不知其背後有著複雜的gamma交換過程!!!
XD!
那又跟上述所提的一大堆的直線性色彩工作法優點與CG算圖或合成過程中的應用又有任何的關係??
因為最早期的映像管螢幕(CRT)在製程中會出現gamma
2.2的情況,
所以所有數位檔案便從此被要求在寫入檔案過程中加入gamma
0.4545的變亮曲線之工業標準! 即使新一代的LCD螢幕可以使用gamma
1.0製造,
但考慮與舊系統或現有套裝應用軟體的”相容”
LCD螢幕還是繼續保有gamma
2.2的特性!
所以所有數位影像在儲存過程中還是保有寫入gamma
0.4545的變亮曲線!
其實這個”寫入gamma
0.4545的變亮曲線” 變成所有”非”直線性色彩的萬惡根源.
因為大部分的合成軟體或算圖引擎其內部運算都是採取直線性色彩運算! 但輸入影像素材或貼圖進入軟體卻是帶gamma
0.4545非直線性色彩的color space.
所以直線性色彩工作法的第一關鍵就是清楚告訴軟體你所輸入的影像素材或貼圖是何種color
space, 如果是數位相機攝影機或從網頁下在的素材圖片, 基本上都是統稱gamma
2.2 color space (應該正確的說是gamma 2.2反函數(1/2.2=0.4545))
或
Adobe所制定的sRGB color space., 當軟體知道素材或貼圖是何種color
space時, 在送入運算之前, 軟體會先套上color
space的相反數曲線(反函數), 使所有素材或貼圖從”非”直線性色彩進入到”
直線性色彩”,
所有有關色彩運算便從此符合自然世界物理,
享有所有”直線性色彩工作法”的所有優點!
結束了嗎?? 還沒! No
pain! No get!
因為所有貼圖及運算都已直線性色彩化, 所獲得的算圖結果也是直線性色彩結果,
根據前述直線性色彩結果很暗!
所以無法提供算圖結果優劣判斷!
在軟體端的出圖結果上要透過LUT(Look
UP Table)的幫忙, 在最後結果上一層拉亮處理的曲線通常是sRGB或
rec709.
結論:
在認識直線性工作法概念後:
1: 確認輸入素材影像color space!
一般來說! 所有在螢幕看起來正常(老實說colorspace無法從任何判斷)或數位相機攝影機或從網頁下在的素材圖片都是gamma
2.2/ sRGB color space.
大部分OpenEXR/ HDR/ 32bit Tiff是
Linear color space
dpx/ cin 統稱使用log color space
使用在Bump texture/ Normal texture/
Dispacement texture不須套用任何color space轉換,
當linear
color使用!
2: 啟動軟體的直線性色彩運算模式
Photoshop/ After Effects/ 3ds MAX mentalray/ Maya mentalray : 後續介紹各軟體如何啟動!
Nuke無須任何啟動, 它預設就是一個優化的”直線性色彩工作法”環境
3: 選擇理想的LUT
4: 輸出檔案時再決定需要帶何種color space出去
2012年10月16日 星期二
Nuke useful SliceTool
set cut_paste_input [stack 0]
version 6.3 v4
push $cut_paste_input
Group {
name SliceTool39
selected true
xpos -625
ypos -93
addUserKnob {20 SliceTool}
addUserKnob {4 output M {Over Right Left Top Bottom}}
output Right
addUserKnob {7 scanlinePosition l "scanline position"}
scanlinePosition 0.5
addUserKnob {20 settings l Settings}
addUserKnob {7 thickness l "curve thickness"}
thickness 0.5
addUserKnob {7 scanlineThickness l "scanline thickness" R 1 10}
scanlineThickness 5
addUserKnob {12 pos1 l INVISIBLE +INVISIBLE}
pos1 {0 {int(input.format.h*scanlinePosition)}}
addUserKnob {12 pos2 l INVISIBLE +INVISIBLE}
pos2 {{input.format.w} {pos1.y}}
}
Input {
inputs 0
name Input
xpos -535
ypos -261
}
set Na1d2e00 [stack 0]
Transform {
translate {{-parent.pos1 i} {-parent.pos1 i}}
black_outside false
name Transform4
label T
xpos -535
ypos -231
}
Transform {
rotate {{"-degrees( atan2(parent.pos2.y-parent.pos1.y, parent.pos2.x-parent.pos1.x) )" i}}
black_outside false
name Transform5
label "R\n"
xpos -535
ypos -197
}
Transform {
scale {{"width / sqrt(pow(parent.pos2.x-parent.pos1.x,2) + pow(parent.pos2.y-parent.pos1.y,2))" i}}
black_outside false
name Transform6
label S
xpos -535
ypos -160
}
Crop {
box {0 0 {Input.width i} 1}
reformat true
crop false
name Crop1
xpos -536
ypos -117
}
Reformat {
type "to box"
box_width {{Input.width i}}
box_height {{Input.height i}}
box_fixed true
resize distort
filter Impulse
name Reformat1
xpos -536
ypos -92
}
Expression {
expr0 "fabs((y/height)-r)<=tolerance ? 1 : 0"
expr1 "fabs((y/height)-g)<=tolerance ? 1 : 0"
expr2 "fabs((y/height)-b)<=tolerance ? 1 : 0"
name Expression3
xpos -533
ypos -51
addUserKnob {20 User}
addUserKnob {7 tolerance}
tolerance {{parent.thickness/100 i}}
}
set Na33b6b0 [stack 0]
Dot {
name Dot3
xpos -163
ypos -48
}
set Na33b9e0 [stack 0]
Dot {
name Dot4
xpos -62
ypos -48
}
set Na33bd10 [stack 0]
Dot {
name Dot6
xpos 37
ypos -48
}
set Na33c040 [stack 0]
Dot {
name Dot9
xpos 159
ypos -48
}
Constant {
inputs 0
channels rgb
color {100 100 -100 0}
name Constant1
xpos -360
ypos -399
}
Reformat {
type "to box"
box_width {{Input.format.w i}}
box_height {{int(parent.scanlineThickness) i}}
box_fixed true
resize distort
center false
filter Impulse
name Reformat2
xpos -360
ypos -333
}
Transform {
translate {0 {-int((parent.scanlineThickness/2)*parent.scanlinePosition) i}}
center {1024 1.5}
filter Impulse
name Transform2
xpos -360
ypos -315
}
Transform {
translate {{parent.pos1 i} {parent.pos1-int((parent.scanlineThickness*parent.scanlinePosition)+(Transform2.translate.y*parent.scanlinePosition)) i}}
center {1024 0.5}
name Transform1
xpos -360
ypos -297
}
push $Na1d2e00
Merge2 {
inputs 2
name Merge2
xpos -360
ypos -261
}
Dot {
name Dot2
xpos -237
ypos -256
}
set Na33d690 [stack 0]
Dot {
name Dot1
xpos -119
ypos -256
}
set Na33d9c0 [stack 0]
Dot {
name Dot5
xpos -6
ypos -256
}
set Na33dcf0 [stack 0]
Dot {
name Dot8
xpos 104
ypos -256
}
set Na33e020 [stack 0]
Dot {
name Dot7
xpos 220
ypos -256
}
ContactSheet {
inputs 2
width {{Input.width i}}
height {{Input.height*2 i}}
rows 2
columns 1
roworder TopBottom
name ContactSheet2
xpos 186
ypos -27
}
push $Na33c040
push $Na33e020
ContactSheet {
inputs 2
width {{Input.width i}}
height {{Input.height*2 i}}
rows 2
columns 1
name ContactSheet3
xpos 74
ypos -25
}
push $Na33bd10
push $Na33dcf0
ContactSheet {
inputs 2
width {{Input.width*2 i}}
height {{Input.height i}}
rows 1
columns 2
colorder RightLeft
name ContactSheet4
xpos -40
ypos -22
}
push $Na33b9e0
push $Na33d9c0
ContactSheet {
inputs 2
width {{Input.width*2 i}}
height {{Input.height i}}
rows 1
columns 2
name ContactSheet1
xpos -153
ypos -21
}
push $Na33b6b0
push $Na33b6b0
ChannelMerge {
inputs 2
A rgba.red
B rgba.green
name ChannelMerge1
xpos -533
ypos 16
}
set Na3dddb0 [stack 0]
push $Na3dddb0
ChannelMerge {
inputs 2
B rgba.blue
name ChannelMerge2
xpos -533
ypos 84
}
push $Na33d690
Merge2 {
inputs 2
name Merge1
xpos -268
ypos 95
}
Switch {
inputs 5
which {{parent.output i}}
name Switch1
xpos -150
ypos 95
}
Output {
name Output1
xpos -150
ypos 153
}
end_group
version 6.3 v4
push $cut_paste_input
Group {
name SliceTool39
selected true
xpos -625
ypos -93
addUserKnob {20 SliceTool}
addUserKnob {4 output M {Over Right Left Top Bottom}}
output Right
addUserKnob {7 scanlinePosition l "scanline position"}
scanlinePosition 0.5
addUserKnob {20 settings l Settings}
addUserKnob {7 thickness l "curve thickness"}
thickness 0.5
addUserKnob {7 scanlineThickness l "scanline thickness" R 1 10}
scanlineThickness 5
addUserKnob {12 pos1 l INVISIBLE +INVISIBLE}
pos1 {0 {int(input.format.h*scanlinePosition)}}
addUserKnob {12 pos2 l INVISIBLE +INVISIBLE}
pos2 {{input.format.w} {pos1.y}}
}
Input {
inputs 0
name Input
xpos -535
ypos -261
}
set Na1d2e00 [stack 0]
Transform {
translate {{-parent.pos1 i} {-parent.pos1 i}}
black_outside false
name Transform4
label T
xpos -535
ypos -231
}
Transform {
rotate {{"-degrees( atan2(parent.pos2.y-parent.pos1.y, parent.pos2.x-parent.pos1.x) )" i}}
black_outside false
name Transform5
label "R\n"
xpos -535
ypos -197
}
Transform {
scale {{"width / sqrt(pow(parent.pos2.x-parent.pos1.x,2) + pow(parent.pos2.y-parent.pos1.y,2))" i}}
black_outside false
name Transform6
label S
xpos -535
ypos -160
}
Crop {
box {0 0 {Input.width i} 1}
reformat true
crop false
name Crop1
xpos -536
ypos -117
}
Reformat {
type "to box"
box_width {{Input.width i}}
box_height {{Input.height i}}
box_fixed true
resize distort
filter Impulse
name Reformat1
xpos -536
ypos -92
}
Expression {
expr0 "fabs((y/height)-r)<=tolerance ? 1 : 0"
expr1 "fabs((y/height)-g)<=tolerance ? 1 : 0"
expr2 "fabs((y/height)-b)<=tolerance ? 1 : 0"
name Expression3
xpos -533
ypos -51
addUserKnob {20 User}
addUserKnob {7 tolerance}
tolerance {{parent.thickness/100 i}}
}
set Na33b6b0 [stack 0]
Dot {
name Dot3
xpos -163
ypos -48
}
set Na33b9e0 [stack 0]
Dot {
name Dot4
xpos -62
ypos -48
}
set Na33bd10 [stack 0]
Dot {
name Dot6
xpos 37
ypos -48
}
set Na33c040 [stack 0]
Dot {
name Dot9
xpos 159
ypos -48
}
Constant {
inputs 0
channels rgb
color {100 100 -100 0}
name Constant1
xpos -360
ypos -399
}
Reformat {
type "to box"
box_width {{Input.format.w i}}
box_height {{int(parent.scanlineThickness) i}}
box_fixed true
resize distort
center false
filter Impulse
name Reformat2
xpos -360
ypos -333
}
Transform {
translate {0 {-int((parent.scanlineThickness/2)*parent.scanlinePosition) i}}
center {1024 1.5}
filter Impulse
name Transform2
xpos -360
ypos -315
}
Transform {
translate {{parent.pos1 i} {parent.pos1-int((parent.scanlineThickness*parent.scanlinePosition)+(Transform2.translate.y*parent.scanlinePosition)) i}}
center {1024 0.5}
name Transform1
xpos -360
ypos -297
}
push $Na1d2e00
Merge2 {
inputs 2
name Merge2
xpos -360
ypos -261
}
Dot {
name Dot2
xpos -237
ypos -256
}
set Na33d690 [stack 0]
Dot {
name Dot1
xpos -119
ypos -256
}
set Na33d9c0 [stack 0]
Dot {
name Dot5
xpos -6
ypos -256
}
set Na33dcf0 [stack 0]
Dot {
name Dot8
xpos 104
ypos -256
}
set Na33e020 [stack 0]
Dot {
name Dot7
xpos 220
ypos -256
}
ContactSheet {
inputs 2
width {{Input.width i}}
height {{Input.height*2 i}}
rows 2
columns 1
roworder TopBottom
name ContactSheet2
xpos 186
ypos -27
}
push $Na33c040
push $Na33e020
ContactSheet {
inputs 2
width {{Input.width i}}
height {{Input.height*2 i}}
rows 2
columns 1
name ContactSheet3
xpos 74
ypos -25
}
push $Na33bd10
push $Na33dcf0
ContactSheet {
inputs 2
width {{Input.width*2 i}}
height {{Input.height i}}
rows 1
columns 2
colorder RightLeft
name ContactSheet4
xpos -40
ypos -22
}
push $Na33b9e0
push $Na33d9c0
ContactSheet {
inputs 2
width {{Input.width*2 i}}
height {{Input.height i}}
rows 1
columns 2
name ContactSheet1
xpos -153
ypos -21
}
push $Na33b6b0
push $Na33b6b0
ChannelMerge {
inputs 2
A rgba.red
B rgba.green
name ChannelMerge1
xpos -533
ypos 16
}
set Na3dddb0 [stack 0]
push $Na3dddb0
ChannelMerge {
inputs 2
B rgba.blue
name ChannelMerge2
xpos -533
ypos 84
}
push $Na33d690
Merge2 {
inputs 2
name Merge1
xpos -268
ypos 95
}
Switch {
inputs 5
which {{parent.output i}}
name Switch1
xpos -150
ypos 95
}
Output {
name Output1
xpos -150
ypos 153
}
end_group
2012年10月5日 星期五
2012年9月12日 星期三
2012年8月14日 星期二
2012年7月13日 星期五
2012年7月11日 星期三
2012年5月23日 星期三
Nuke & ARRI ALEXA color management!
Color profile need to be add in init.py
--------------------------------------------------------------------------------------------------------
#custom input/output LUTs
nuke.root().knob('luts').addCurve("AlexaV3LogC", "{ (t > 0.1496582 ? pow(10.0, (t - 0.385537) / 0.2471896) : t / 0.9661776 - 0.04378604) * 0.18 - 0.00937677 }")
# ViewerProcess LUTs
nuke.ViewerProcess.register("AlexaV3Rec709",nuke.createNode,("Vectorfield", "vfield_file C:/luts/AlexaV3_K1S1_LogC2Video_Rec709_EE_nuke3d.cube colorspaceIn AlexaV3LogC"))
--------------------------------------------------------------------------------------------------------
Sample init.py
ARRI ALEXA Lut generator link!
2012年5月2日 星期三
2012年4月27日 星期五
2012年4月19日 星期四
2012年3月26日 星期一
2012年3月9日 星期五
2012年3月7日 星期三
2012年2月24日 星期五
2012年2月18日 星期六
Using NUKE as a Render Preview to ANY 3D Renderer
Thanks' Drake's info....
This is the way it goes....
quick links:
http://code.google.com/p/cortex-vfx/
http://code.google.com/p/cortex-vfx/source/detail?r=4520
http://j3pnyc.com/index.html
quick links:
http://code.google.com/p/cortex-vfx/
http://code.google.com/p/cortex-vfx/source/detail?r=4520
http://j3pnyc.com/index.html
2012年2月15日 星期三
2012年2月14日 星期二
豪小子的父母 才真不簡單!
豪小子的父母 才真不簡單!
well said "學習到如何幫助孩子及早尋得自己生命的價值,引導合適的道路,接納他們的跌倒與失敗,並繼續鼓勵他們完成自己的夢想。這可能會是一條與他人不一樣的路,無法馬上有清楚的結果可以期待,但我們卻可以與孩子一起經歷生命中真實的歡笑與淚水。" Thanks Bryant's sharing info!2012年2月13日 星期一
2012年2月8日 星期三
2012年2月3日 星期五
The Fantastic Flying Books of Mr. Morris Lessmore
在這網路與媒體充斥的年代, 你有多久沒有好好讀一本好書呢? 也許 Moonbot Studios 的短篇動畫會勾起你一些感動.....
這部動畫短片讓我想起1998年的劇情片Pleasantville, 劇中人物因為發現自我而呈現自己的ture color!.....
我與許多人一樣想用動漫/設計/文創..等等外殼去膨脹與成就.... 而我內在在最重要的"打動人心"的部分卻一件也沒做好! 真是慚愧!
2012年1月30日 星期一
2012年1月17日 星期二
2012年1月9日 星期一
2012年1月1日 星期日
曙光..........2012
People said 2012 will be a bad year in some way....
But I might have different point of view.......... Even I had experienced all the bad thing happen this year...
Thanks God and my family!
Two soundtracks that reflect my mind....
But I might have different point of view.......... Even I had experienced all the bad thing happen this year...
Thanks God and my family!
Two soundtracks that reflect my mind....
訂閱:
文章 (Atom)