Direct3D中投影空间内的点坐标与屏幕上点的对应关系
2014-01-04 16:48
363 查看
原文链接为:
http://www.cnitblog.com/luckydmz/archive/2010/10/08/69779.html
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)
v = y * -0.5 + (0.5 + 0.5/h)
参考:http://www.gesoftfactory.com/developer/Textures.htm
http://www.cnitblog.com/luckydmz/archive/2010/10/08/69779.html
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)
v = y * -0.5 + (0.5 + 0.5/h)
参考:http://www.gesoftfactory.com/developer/Textures.htm
相关文章推荐
- Direct3D中投影空间内的点坐标与屏幕上点的对应关系
- 投影空间坐标与屏幕的对应关系
- GIS地理信息系统中的空间地理坐标与屏幕坐标的对应关系
- GIS地理信息系统中的空间地理坐标与屏幕坐标的对应关系
- 根据顶点的投影坐标,获取对应的屏幕纹理的纹理坐标
- 地理(投影)坐标与屏幕坐标的转换!
- linux的物理内存空间与线性地址空间的的对应关系
- 如何区分空间参考、坐标系统、投影、基准面和椭圆体?
- 族的坐标和实例的坐标间的对应关系
- windows 屏幕坐标 窗口坐标 客户区坐标 逻辑坐标 设备坐标之间的关系及转换
- windows 屏幕坐标 窗口坐标 客户区坐标 逻辑坐标 设备坐标之间的关系及转换
- windows 屏幕坐标 窗口坐标 客户区坐标 逻辑坐标 设备坐标之间的关系及转换
- OpenCV 行列值与坐标的对应关系
- 表空间、数据文件对应关系
- windows 屏幕坐标 窗口坐标 客户区坐标 逻辑坐标 设备坐标之间的关系及转换
- 针孔相机拍摄的图像坐标和空间点的对应关系
- 针孔相机拍摄的图像坐标和空间点的对应关系
- BNU4299——God Save the i-th Queen——————【皇后攻击,找到对应关系压缩空间】
- 一段关于讲解傅里叶变化、傅里叶谱与空间图像的对应关系的资料
- d3d 纹理坐标1:1对应到屏幕坐标.