當前位置:
首頁 >
光栅化坐标映射公式
發布時間:2023/12/4
35
豆豆
Direct3D中投影空間內的點坐標與屏幕上(或視口內)點的對應關系,
設屏幕大小為w×h,屏幕左上角像素的中心被定義為(0,0),整個屏幕是從(-0.5,-0.5)-(w-0.5,h-0.5),
像素
將投影空間內的x軸上區間(-1.0-1/w, 1.0-1/w]均勻分成w份,每份長度2/w,
將投影空間內的y軸上區間(-1.0-1/h, 1.0-1/h]均勻分成h份,每份長度2/h。
例如最左側的像素點的對應的橫坐標區間為(-1.0-1/w,-1.0+1/w],依次類推。
對于更一般的情況有
光柵化公式 投影空間坐標(x,y) -> 屏幕像素坐標(Sx,Sy)
Sx = x * (w/2) + (w/2)?? [1]
Sy = y * (-h/2) + (h/2)? [2]
以上是光柵化時的規律,在紋理采樣時,Direct3D使用如下公式
采樣公式 紋理坐標(u,v) -> 圖素坐標(Tx,Ty)
Tx = u*w - 0.5? [3]
Ty = v*h - 0.5? [4]
如果需要將一張圖的左上角(最左上角圖素的左上角)對應到屏幕的左上角
有些人可能會將左上角Vertex的投影空間坐標設置為(-1.0,1.0),其實這是不對的,我們可以用光柵化公式推導一下,
當(x,y) = (-1.0,1.0)時,
Sx = x * (w/2) + (w/2) = 0
Sy = y * (-h/2) + (h/2) = 0
而(Sx,Sy)=(0,0)并不是屏幕的左上角,而是屏幕左上角像素的中心,屏幕的左上角坐標應該是(-0.5,-0.5)
解
x * (w/2) + (w/2) = -0.5
y * (-h/2) + (h/2) = -0.5
可得,
x = -1 -1/w
y = 1 + 1/h
這才是正確的Vertex的投影空間坐標
結合光柵化公式和采樣公式我們還可以推導一下ShadowMap中采樣深度圖的紋理坐標,首先明確問題:
即,已知深度圖上一點是由投影空間坐標(x,y)光柵化成的,現在要采樣該點,計算(u,v),用(x,y)表示。
解:只需將建立方程讓紋理坐標對應的圖素坐標=屏幕像素坐標(即深度圖上的圖素坐標)
Tx = Sx
Ty = Sy
將[1],[2],[3],[4]式代入可解得,
u = x * 0.5 + (0.5 + 0.5/w)
參考:http://www.gesoftfactory.com/developer/Textures.htm
設屏幕大小為w×h,屏幕左上角像素的中心被定義為(0,0),整個屏幕是從(-0.5,-0.5)-(w-0.5,h-0.5),
像素
將投影空間內的x軸上區間(-1.0-1/w, 1.0-1/w]均勻分成w份,每份長度2/w,
將投影空間內的y軸上區間(-1.0-1/h, 1.0-1/h]均勻分成h份,每份長度2/h。
例如最左側的像素點的對應的橫坐標區間為(-1.0-1/w,-1.0+1/w],依次類推。
對于更一般的情況有
光柵化公式 投影空間坐標(x,y) -> 屏幕像素坐標(Sx,Sy)
Sx = x * (w/2) + (w/2)?? [1]
Sy = y * (-h/2) + (h/2)? [2]
以上是光柵化時的規律,在紋理采樣時,Direct3D使用如下公式
采樣公式 紋理坐標(u,v) -> 圖素坐標(Tx,Ty)
Tx = u*w - 0.5? [3]
Ty = v*h - 0.5? [4]
如果需要將一張圖的左上角(最左上角圖素的左上角)對應到屏幕的左上角
有些人可能會將左上角Vertex的投影空間坐標設置為(-1.0,1.0),其實這是不對的,我們可以用光柵化公式推導一下,
當(x,y) = (-1.0,1.0)時,
Sx = x * (w/2) + (w/2) = 0
Sy = y * (-h/2) + (h/2) = 0
而(Sx,Sy)=(0,0)并不是屏幕的左上角,而是屏幕左上角像素的中心,屏幕的左上角坐標應該是(-0.5,-0.5)
解
x * (w/2) + (w/2) = -0.5
y * (-h/2) + (h/2) = -0.5
可得,
x = -1 -1/w
y = 1 + 1/h
這才是正確的Vertex的投影空間坐標
結合光柵化公式和采樣公式我們還可以推導一下ShadowMap中采樣深度圖的紋理坐標,首先明確問題:
即,已知深度圖上一點是由投影空間坐標(x,y)光柵化成的,現在要采樣該點,計算(u,v),用(x,y)表示。
解:只需將建立方程讓紋理坐標對應的圖素坐標=屏幕像素坐標(即深度圖上的圖素坐標)
Tx = Sx
Ty = Sy
將[1],[2],[3],[4]式代入可解得,
u = x * 0.5 + (0.5 + 0.5/w)
v = y * -0.5 + (0.5 + 0.5/h)
結論:
屏幕坐標系:
Tx = Sx
Ty = Sy
Sy = y * (-h/2) + (h/2)???????????????? [2]
深度圖紋理坐標系:
u = x * 0.5 + (0.5 + 0.5/w)
v = y * -0.5 + (0.5 + 0.5/h)
投影空間坐標(x,y), 深度圖上一點是由投影空間坐標(x,y)光柵化成的。參考:http://www.gesoftfactory.com/developer/Textures.htm
總結
- 上一篇: 出汗越多减肥越快吗
- 下一篇: RBM/DBN训练中的explainin