我想这是一个数学问题,而不是OpenGL的问题,但我离题了。无论如何,如果透视分割的全部目的是获得可用的x和y坐标,为什么麻烦将z除以w?另外我怎样才能获得w?为什么我用W在OpenGL的透视投影中将W除以W?
回答
实际上,这个解释与深度缓冲区的局限性有很大关系。
简单来说,“深度缓冲区是一种纹理,其中每个屏幕上的像素都会根据其离摄像机的距离分配一个灰度值,从而使视觉效果可以随距离轻松改变。 Source
更准确地说,一个深度缓冲器是含有ž/的瓦特值对于每个fragment,其中纹理:
- Ž是从近裁剪面的距离到片段。
- W是从相机到片段的距离。
在示出Ž,瓦特,和ž /瓦特之间的关系在下图中,Ñ等于zNear
参数传递给gluPerspective
或等效的功能,和f等于参数zFar
传递给同一个函数。
一目了然,这个系统看起来不直观。但作为一个结果,ž /瓦特总是0和1之间的浮点值(0/Ñ和˚F/˚F),并且因此可以被表示为一个单信道质地。
第二个重要注意事项:深度缓冲区是非线性的,这意味着深度缓冲区中精确位于近距离和远距离剪切平面之间的物体无法接近0.5值。如上所示,它将与深度缓冲区中的值0.999相关联。根据你的观点,这可能是好的或坏的;你可能希望深度缓冲区更加详细的特写(它是),或者在整个过程中提供更详细的信息(它没有)。
TL; DR:
- 您划分Ž通过瓦特所以它总是在范围[0,1]。
- W是从相机到片段的距离。
我真的不完全同意这个答案,这个问题属于纯数学问题,这里解释的是opengl和z-buffer算法的实现细节(深度缓冲区)。 – 2014-08-31 14:05:32
NDC中的z在范围[-1,1]中,而不是[0,1],这是DirectX约定。 – SnappleLVR 2017-05-30 13:26:51
- 1. OpenGL 3.2 w/NSOpenGLView
- 2. C++ STL - 为什么要用(W <* I),而不是(W == * I)
- 3. 为什么这种模式不匹配? ([\\\\ A \\\\ W]其中[\\\\ W \\\\ z])
- 4. Ruby中的%w {}和%W {}大小写W数组字面量有什么区别?
- 5. 在PHP fopen函数中,w和w +模式有什么区别?
- 6. is re.split(“\ W”)= re.split(“\ w”)?
- 7. 这两个命令之间的区别(w&w/out“”)以及为什么?
- 8. Android - OpenGL不显示w/emulator?
- 9. 自动ctrl-w w到vimrc
- 10. 是什么分裂( “\\ W”)和分离之间的差值( “[^ \\ W']”)
- 11. 幻影类型w/AnyVal?
- 12. 这是什么意思? Z = A(xxx:xxx + w-1,yyy:yyy + w-1,:);
- 13. OpenGL中的透视投影矩阵
- 14. 与NA(W)和NB(W)在语言
- 15. R中的人口金字塔w投影
- 16. 为什么JavaScript RegExp/^ \ w + $/match未定义?
- 17. C++为什么`observer_ptr <W>`有一个带`W *`的构造函数?
- 18. 为什么转义'w'('\ w')字符会颠倒int变量的内存表示?
- 19. 拆分字符串与正则表达式\ w \ w *? \ w +?
- 20. NSDateFormatter “W”
- 21. W/ClassMapper:在类
- 22. Silverlight MVVM:MainView w/SubViews或MainViewModel w/SubViewModels
- 23. ^[A-Za-z](\ W | \ w)*正则表达式?
- 24. PHP正则表达式除了W,W,P,p
- 25. 删除linebreak w/o \ r \ n
- 26. 排除导入w/Babel?
- 27. 删除记录VB2010 w/TableAdapter
- 28. 删除对象W/json.net
- 29. DFA构造为L = {(NA(w)的-nb(W))模3> 0}
- 30. 颜色到B/W JavaScript的影响
http://en.wikipedia。org/wiki/Transformation_matrix#Perspective_projection – 2014-08-30 16:46:51
这与均匀坐标有关。他们映射R^3 - > R^4显然不是一对一的。 w因子可以'cannonized'为1.但是应用4x4矩阵算子的结果'w'可能会改变。如果我没有记错,均匀坐标的一个优点是将翻译作为线性算子。 – Yotam 2014-08-30 17:53:34