-1

我无法理解 OpenGL 中空间的核心概念。几个星期以来,我一直在阅读一本关于现代 3D 图形的在线书籍,我经常发现自己对程序中使用的所有空间感到困惑。具体来说,空间如:模型空间、世界空间、相机空间、剪辑空间。我似乎无法理解我应该将矩阵转换为的顺序,这是我的一个教程程序中的一个示例:

//.vert shader of a program
#version 330

layout(location = 0) in vec4 position;

uniform mat4 cameraToClipMatrix;
uniform mat4 worldToCameraMatrix;
uniform mat4 modelToWorldMatrix;

void main()
{
    vec4 temp = modelToWorldMatrix * position;
    temp = worldToCameraMatrix * temp;
    gl_Position = cameraToClipMatrix * temp;
}

cameraToClip、worldToCamera、XtoY、ZtoQ,我如何才能了解 OpenGL、网站中的这些空间?视频?参考?或者我应该回去重新阅读教程中这些空间的信息,直到它附着在我的大脑上。

4

2 回答 2

1

我真的不知道如何解释它比我做得更好。尤其是当矩阵被尽可能清晰地命名时。

把矩阵想象成一个函数。函数有输入并返回一个值。您必须传递正确的输入,否则您的编译器会报错。

考虑这些函数:

Float intToFloat(Int i);
Double floatToDouble(Float f);
Real doubleToReal(Double d);

其中IntFloatDoubleReal是用户定义的 C++ 类型。

假设我需要编写这个函数:

Real intToReal(Int i);

所以我只有一个Int. 在上述函数中,我可以调用的函数只有一个intToFloat: . 这个名字说明了一切:它需要一个 int 并将其转换为 float。因此,给定一个Int,我唯一能做的就是 call intToFloat

Int i = ...;
Float f = intToFloat(i);

好吧,现在我有一个Float. 我只能调用一个函数:floatToDouble.

Double d = floatToDouble(d);

有了这个,我只能打电话doubleToReal。这意味着我们的intToReal功能是:

Real intToReal(Int i)
{
  Int i = ...;
  Float f = intToFloat(i);
  Double d = floatToDouble(d);
  return doubleToReal(d);
}

就像矩阵示例一样。

顶点着色器所做的最重要的事情是将位置从其原始空间(称为模型空间)转换到 OpenGL 定义的称为剪辑空间的空间。这是大多数顶点着色器的工作#1。

矩阵就像那些函数一样,将位置转换为中间空间。

于 2012-11-17T22:51:36.533 回答
0

这个问题在解决之前是没有答案的。对某些人来说足够好,让他们理解概念的东西,不会对每个人都有同样的效果。我最好的建议是在成为 3D 程序员之前先学习成为 3D 建模师。这就是我所做的。一旦您对数据的可视化非常熟悉,那么您就可以更轻松地形成心智模型,并牢记它们的编码。当您需要进一步的可视化来帮助您创建算法时,您将能够在不使用代码的情况下创建它们。

于 2012-11-20T14:44:19.620 回答