为什么OpenGL中的剪辑空间具有4个尺寸?


13

我将其用作一般参考,但是我浏览在线文档和书籍的次数越多,对此的理解就越少。

const float vertexPositions[] = {
    0.75f, 0.75f, 0.0f, 1.0f,
    0.75f, -0.75f, 0.0f, 1.0f,
    -0.75f, -0.75f, 0.0f, 1.0f,
};

在这本在线书中,有一个示例,说明如何为OpenGL绘制第一个经典的hello世界,即制作三角形。

三角形的顶点结构按照上面的代码声明。

与其他所有相关资料一样,这本书强调了“剪辑空间”是一种4D结构,该结构用于基本确定将要栅格化并渲染到屏幕的内容。

这是我的问题:

  • 我无法想象4D的东西,我不认为人类可以做到这一点,此Clip空间的4D是什么?
  • 我读过的最易读的文档是关于相机的,这只是对剪切概念的抽象,我明白了,问题是,为什么不首先使用相机的概念呢?熟悉的3D结构?带有摄像头的概念,唯一的问题是,你需要定义其他方式准,所以你基本上要添加什么其他的语句的相机,你希望有。
  • 我应该怎么读0.75f, 0.75f, 0.0f, 1.0f呢?我得到的只是它们都是浮点值,我得到前三个值的含义,这意味着最后一个是什么?

4
第4章确切解释了第四部分的功能。其实,把它刮开;第1章中途解释了光栅化部分中的Clip-to-NDC变换
Nicol Bolas 2012年

2
@NicolBolas作者在第一章中给出了解释,而在下一章中没有提供任何参考,他还假装解释了在注释某些c ++代码时接下来会发生什么,问题是如果他没有完全解释其中的所有内容,第一章将我本应知道的内容放在第4章中没有多大意义,尤其是如果我需要此概念来解码第一章中的内容时。我现在正在读这篇文章,而不仅仅是阅读1次,现在我知道我应该进一步寻找答案,我将深入各个章节。
user827992 2012年

1
您无需解码任何内容;它在第1章中说:W组件分为其他3个组件。引言中也对此进行了说明。推迟到第4章的原因是OpenGL这么做的原因。推迟到以后再进行,因为它与手头的任务无关。
Nicol Bolas 2012年

3
对于眼前的问题,它仍然是无关紧要的信息(即:渲染三角形)。您对此感到好奇,但是您不需要了解为什么这就是理解它是如何工作的方式。在学习任何东西时,第一步就是了解它是什么。一旦了解了正在发生的事情,就可以讨论为什么会这样。
Nicol Bolas 2012年

1
这个答案可能会有所帮助。
iammilind

Answers:


9

神奇的术语是“同质坐标”,该参数用于影响透视的系统中。查看Wiki以获得概述,但是要真正理解它(我不知道)是一个漫长的学习过程。


10

阅读您所读书籍的介绍,您会感到惊讶;)

http://arcsynthesis.org/gltut/Basics/Intro%20Graphics%20and%20Rendering.html在“栅格化概述”下

“ w”值(前三个值分别是x,y和z)基本上表示剪辑空间的尺寸。因为这是1个标量值,所以剪贴空间的所有3个维都是相等的(这就是剪贴空间是立方体的原因)。每个顶点都有它自己的剪贴空间(基本上需要“放入”,否则为CLIPS:D),没有1个“世界”是剪贴空间(尽管所有剪贴空间都在同一“世界”,我认为,即使是我对这个; P)也遇到了麻烦。

因此,例如,如果您的顶点具有坐标[1,1,1],则如果剪辑空间为1,则该顶点位于屏幕右上角的右上角(当所有设置为默认值时,我不知道方向可以更改)。但是,如果顶点的裁剪空间为2,则坐标[1,1,1]会位于屏幕右侧的四分之三,屏幕顶部的三分之四以及第三个维度可以猜到你自己。

我认为,假设剪辑空间为5,则表示该剪辑空间中每个维度上的位置范围从-5到5,而不是立方体为5x5x5。但这可能是因为简单地说:所有xy和z坐标都除以剪辑空间尺寸,所以基本上您的顶点都经过此操作:

x = x / w

y = y / w

z = z / w

这就是一切的可能。我认为这是为了便于比较。如果坐标已被剪辑空间尺寸除,则具有1个或多个分量的值大于1的坐标将存在于剪辑空间外部。因此,如果您的剪辑空间为1024,但坐标为[2000,3,-100],则x(2000)分量位于剪辑空间之外(其范围从-1024到1024)。

从计算的角度来看,如果要做的就是(非常粗糙地放入c),则很容易判断剪贴空间中是否有东西:(x / w)<1 &&(x / w)>-1然后进行渲染。另外,我假设所有顶点的所有剪贴空间都具有相同的大小(因此每个剪贴空间立方体在每个维度上的范围从-1到1)使归一化过程之后发生的一切变得更容易,因为从那时起所有坐标都是浮动范围从0到1(不考虑已被裁剪的范围)。


问题是为什么剪贴空间保持原样,而不是剪贴空间意味着什么。也就是说,W除法的意义何在。
Nicol Bolas

2
它虽然回答了3个要点的第三个问题,但=)
dammkewl13年

8

TL; DR,它不是4D空间,它是3D加一个几乎始终为1的缩放数字。如果为1,则可以忽略它,并且前三个数字为x,y,z。如果不是这样,它将变得更加复杂。

这是一个简单的解释。3D顶点仅包含三个组成部分

⌈x⌉ v = |y| ⌊z⌋

如果我们要操纵它们(例如旋转,缩放等),则使用矩阵。当然,最常见的示例是“模型-视图-投影”(MVP)矩阵,该矩阵将世界坐标转换为剪辑空间。像这样:

⌈m11 m12 m13⌉ ⌈x⌉ c = |m21 m22 m23| * |y| ⌊m31 m32 m33⌋ ⌊z⌋

但是,这有一个很大的缺陷:您不能翻译。如果[x,y,z]为零,那么无论m结果如何始终为零,因此我们不能拥有包含翻译的MVP。显然,我们想要那样。解决方案是在向量的末尾添加1,并将矩阵扩展为4x4:

⌈cx⌉ ⌈m11 m12 m13 tx⌉ ⌈x⌉ |cy| = |m21 m22 m23 ty| * |y| |cz| |m31 m32 m33 tz| |z| ⌊ 1⌋ ⌊ 0 0 0 1⌋ ⌊1⌋

(如果看任何正交的MVP矩阵-例如from-,glOrtho()您会发现第4行是0 0 0 1。有时它甚至是隐式的。)如果您进行数学研究,您将发现与

⌈cx⌉ ⌈m11 m12 m13⌉ ⌈x⌉ ⌈tx⌉ |cy| = |m21 m22 m23| * |y| + |ty| ⌊cz⌋ ⌊m31 m32 m33⌋ ⌊z⌋ ⌊tz⌋

第4个分量称为w,虽然不必一定是1,但几乎总是这样(无论如何变换之前;之后通常通过将整个向量除以1来重新均一化w)。允许转换矩阵包含翻译是一种黑客。

编辑

我相信最初的动机是透视投影,而3D坐标是不可能的。您只能使用4D向量进行其他转换,但是翻译是最容易理解的。


2
解释一下你的观点。
Timmmm 2015年

+1(假设信息正确),这是一个很好的解释,对我有所帮助。谢谢
卢克

1

我还看到了另一个原因,而先前的答案中没有提到。

翻译矩阵为4x4,因此您还可以翻译“世界”周围的对象。因为使用3x3矩阵,您可以旋转和缩放3d坐标,但是只能使用4x4矩阵平移3d坐标,因此需要在4d向量中表达3d坐标。


您只需要在这样的定义下“需要”一个4d向量。4x4矩阵不仅仅是为了像每个人都喜欢假设并要求他人那样添加。如果您想要的只是旋转后添加平移(至3d点),则只需定义4x3矩阵即可。如果您仅此而已,那就更有效率了。您不必将自己限制在因其他原因而制定的规则中,只需使其看起来更整洁即可。大声笑
水坑
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.