-
13楼
Twinsen 2010-02-11 09:46发表
-
- CxxlMan,z会被放入w,但是进行透视除法之前会进行裁剪,会把z=0的部分剔除掉从而保证透视除法的时候不会存在z=0的顶点。
-
12楼
CxxlMan 2010-02-11 02:25发表
-
那個 z 不是會被放入 w (應說是放入 -z) 嗎,若 z 是 0 ,進行透視除法時沒問題嗎
-
7楼
Twinsen 2010-02-24 09:52发表
-
- 最原始的 透视投影的目的不是为了裁剪,而是为了把3D物体投影到2D平面上在屏幕上显示出来。
- CVV不是必需的,而是为了方便裁剪而生成的产物,
- 如果没有CVV,也可以直接用视锥体进行裁剪,但复杂度很大 ,但透视变换矩阵会简单一些。
-
16楼
CxxlMan 2010-02-22 18:08发表
-
-
透視除法前做裁剪我覺得有矛盾,整個透視投影變換不就是為了能用 CVV 做裁剪嗎,未做透視除法前的頂點應不足以做裁剪吧,一個三角面或線段的各頂點在這階段還未處於 CVV 的座標間中,若能做裁剪還要透視除法做什麼。
另外那個透視投影變換矩陣通常還會和 Z Buffer 或 W Buffer 結合,讓我覺得更頭痛,是不是能補充這部份呢 -
-
-
18楼
Twinsen 2010-02-24 09:52发表
-
-
未作透视除法的顶点具有最大的信息量,因为它包含了w,具有原始的z信息在里面,裁剪的时候是使用齐次形式(x, y, z, w),而透视除法(投影)之后得到的是普通形式(x/w, y/w, z/w)这个就是NDC中的坐标,它是一个损失了信息量的结果,用来进行光栅化操作,其中z/w得到的就是NDC中的深度值,用来做z缓冲深度测试。请先理解透视投影的这个思路和z-buffer的使用情况,再考虑w buffer以及其他一些技术。
-
-
- 20楼 Twinsen 2010-02-25 18:03发表
-
- 在固定流水线中,低级的观察体裁剪可以在(1)世界坐标系中通过 视锥体裁剪; (2)相机坐标系中通过 视锥体裁剪 ;
-
(3)裁剪坐标系中通过CVV裁剪;我们在这篇文章中所说的裁剪就是(3)。这个可以通过图形API(比如opengl以及d3d)在硬件中完成。
-
- 21楼 Twinsen 2010-02-25 18:03发表
-
- 你所说的应该是(2),这个裁剪是在相机空间中进行的,是没有经过透视变换的。是通过在原点的相机系统的视锥体进行裁剪的,这个裁剪就是用视锥体的6个平面(近、远、左、右、上、下)对进入相机空间的多边形进行的。请注意,无论在什么地方进行裁剪,裁剪和投影都是没有直接关系的,如果没有裁剪,投影仍然可以进行。
-
-
透视投影(和 透视除法 相关)的目的是为了把3D物体投影到2D平面上在屏幕上显示出来。(然后是透视除法——也就是投影!(x''/w'', y''/w'', z''/w'')=(x''', y''', z''', 1),最后这个坐标就是在归一化的设备(ps:NDC:归一化的设备)坐标中的点。)
-
CVV和裁剪有关:CVV不是必需的,而是为了方便裁剪而生成的产物,如果没有CVV,也可以直接用视锥体进行裁剪
-
裁剪和投影都是没有直接关系的
-
- 22楼 Twinsen 2010-02-25 18:11发表
-
- 另外,这么说你可能就容易理解了。
- 透视投影可以分成透视变换+投影两个步骤。
- 透视变换就是用透视矩阵去乘顶点(x, y, z, 1),乘完之后呢,我们得到了顶点的齐次形式(x', y', z', w'),用这个齐次形式来做裁剪,得到新的点(x'', y'', z'', w''),
- 然后是透视除法——也就是投影!(x''/w'', y''/w'', z''/w'')=(x''', y''', z''', 1),最后这个坐标就是在归一化的设备坐标中的点。 23楼 Twinsen 2010-02-25 18:15发表
-
-
如果把 透视变换+投影 应用到视锥体上,得到的就是CVV。实际上透视变换 + 投影 的目的就是把视锥体变成CVV,而把它应用于顶点的则可以看作是一种“统一的形变”或者“空间的变换”——经过这个变换,视锥体变成了CVV,而其他的顶点也按照这个模子进行变换。
-
-
-
-
-
- 关于Z = 0 的情况分析
-
- 27楼 Twinsen 2010-02-26 13:16发表
-
-
:)对于裁剪来说,就是CVV阿,xyz都在[-1, 1]的范围。这个是透视变换的目的之一阿。
-
11楼
Twinsen 2010-02-10 09:46发表
-
- CxxlMan,我们推导矩阵的时候需要除以z,但实际上矩阵推导完成之后,会在透视除法之前进行裁剪。所以z=0的部分都会被剔除掉,不会出现除零的情况。这也看出裁剪的必要性。
-
10楼
CxxlMan 2010-02-09 20:16发表
-
-
我有一個疑問
那個 z 的值若正好為 0 不會有問題嗎?
24楼
CxxlMan 2010-02-25 19:59发表
-
-
- 本來透視投影和裁剪是沒直接關西,我是對 w = 0 的情況有疑問,可是你說在透視除法前會先裁剪掉造成 w = 0 的頂點,若真是如此就有依存關西了,若 D3D 和 OpenGL 真的在透視除法前會先裁剪掉就太好了,不用擔心 w 會等於 0 的問題,可是真的有這麼做嗎?而且現在流行 Shader 的方式,把各個轉換矩陣都先乘好,直接用來處理頂點,也沒事先做裁剪,完全信任 D3D 和 OpenGL 會在 CVV 做好裁剪,這對 w = 0 的情況要怎麼解決
- 13楼 Twinsen 2010-02-11 09:46发表
-
- CxxlMan,z会被放入w,但是进行透视除法之前会进行裁剪,会把z=0的部分剔除掉从而保证透视除法的时候不会存在z=0的顶点。
-
-
-
-
-
-
-
- 29楼 Twinsen 2010-02-26 16:52发表
-
- CxxlMan,我大概知道你在哪个地方的理解和我不一样了。你可能觉得,在透视除法之前,还没有得到CVV,怎么可能进行CVV裁剪呢?对吧?其实,顶点经过了透视变换之后,变成了齐次形式(x, y, z, w),虽然还没有进行透视除法,但是已经具备了透视除法的条件了,已经可以做透视除法了。而且一旦进行了透视除法(x/w, y/w, z/w, w/w),得到的(x', y', z')就在CVV所在空间中了,可以针对CVV对图元进行裁剪了,这个是比较合理的思路。
-
- 我的理解:
- 裁剪需要透视除法,透视除法也有另一个作用就是 投影【PS: 然后是透视除法——也就是投影!(x''/w'', y''/w'', z''/w'')=(x''', y''', z''', 1),最后这个坐标就是在归一化的设备坐标中的点。】
- 裁剪的步骤是:
-
你可能觉得,在透视除法之前,还没有得到CVV,怎么可能进行CVV裁剪呢?对吧?其实,顶点经过了透视变换之后,变成了齐次形式(x, y, z, w),虽然还没有进行透视除法,但是已经具备了透视除法的条件了,已经可以做透视除法了。而且一旦进行了透视除法(x/w, y/w, z/w, w/w),得到的(x', y', z')就在CVV所在空间中了,可以针对CVV对图元进行裁剪了
-
-
-
-
25楼
CxxlMan 2010-02-26 02:18发表
-
-
你提到:「透視變換就是用透視矩陣去乘頂點(x, y, z, 1),乘完之后呢,我們得到了頂點的齊次形式(x', y', z', w'),用這個齊次形式來做裁剪,得到新的點(x'', y'', z'', w'')」這一點我覺得行不通,就以能避免 w = 0 近裁剪來說。(1) D3D 和 OpenGL 是否真的有在這階段做裁剪。(2) 若不做透視除法,D3D 和 OpenGL 要怎麼決定近裁剪平面在哪。
-
26楼
CxxlMan 2010-02-26 09:06发表
-
- 哈哈! 我懂了, 只要將 -(az+b)/z 指定等於 -1,就可以倒推出近裁剪平面的 z 位置 ,腦筋一時沒轉過來 = =" 很感謝你的指導 ^^
-
-
27楼
Twinsen 2010-02-26 13:16发表
-
-
:)对于裁剪来说,就是CVV阿,xyz都在[-1, 1]的范围。这个是透视变换的目的之一阿。
-
- 透视投影的目的不是为了裁剪,而是为了把3D物体投影到2D平面上在屏幕上显示出来。 CVV不是必需的,而是为了方便裁剪而生成的产物, 如果没有CVV,也可以直接用视锥体进行裁剪,但复杂度很大,但透视变换矩阵会简单一些。
-
-
归一化的设备坐标
(Normalized Device Coordinates) NDC
-
- 未作透视除法的顶点具有最大的信息量,因为它包含了w,具有原始的z信息在里面,裁剪的时候是使用齐次形式(x, y, z, w),而透视除法(投影)之后得到的是普通形式(x/w, y/w, z/w)这个就是NDC中的坐标,它是一个损失了信息量的结果,用来进行光栅化操作,其中z/w得到的就是NDC中的深度值,用来做z缓冲深度测试。请先理解透视投影的这个思路和z-buffer的使用情况,再考虑w buffer以及其他一些技术。
- 透视投影可以分成透视变换+投影两个步骤。
- 透视变换就是用透视矩阵去乘顶点(x, y, z, 1),乘完之后呢,我们得到了顶点的齐次形式(x', y', z', w'),用这个齐次形式来做裁剪,得到新的点(x'', y'', z'', w''),
- 然后是透视除法——也就是投影!(x''/w'', y''/w'', z''/w'')=(x''', y''', z''', 1),最后这个坐标就是在归一化的设备坐标中的点。
-
如果把 透视变换+投影 应用到视锥体上,得到的就是CVV。实际上透视变换 + 投影 的目的就是把视锥体变成CVV,而把它应用于顶点的则可以看作是一种“统一的形变”或者“空间的变换”——经过这个变换,视锥体变成了CVV,而其他的顶点也按照这个模子进行变换。
-
-
- 我的理解:
- 裁剪需要透视除法,透视除法也有另一个作用就是 投影【PS: 然后是透视除法——也就是投影!(x''/w'', y''/w'', z''/w'')=(x''', y''', z''', 1),最后这个坐标就是在归一化的设备坐标中的点。】
- 裁剪的步骤是:
- 你可能觉得,在透视除法之前,还没有得到CVV,怎么可能进行CVV裁剪呢?对吧?其实,顶点经过了透视变换之后,变成了齐次形式(x, y, z, w),虽然还没有进行透视除法,但是已经具备了透视除法的条件了,已经可以做透视除法了。而且一旦进行了透视除法(x/w, y/w, z/w, w/w),得到的(x', y', z')就在CVV所在空间中了,可以针对CVV对图元进行裁剪了