关于OpenGL坐标系统的困惑
我很难理解OpenGL中空间的核心概念。我几个星期以来一直在阅读关于现代3D图形的在线书籍,而且我经常发现自己与程序中使用的所有空间混淆。具体而言,如空间:模型空间,世界空间,相机空间,剪辑空间。我似乎无法总结我的脑海围绕秩序,我应该从进入,一个例子来自我的教程项目之一变换矩阵:关于OpenGL坐标系统的困惑
//.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,网站中了解这些空间?视频?参考?或者我应该回去重新阅读教程中这些空间的信息,直到它贴近我的大脑。
我真的不知道如何解释它比我做得更好。特别是当矩阵被清楚地命名时。
想象一个矩阵就像一个函数。一个函数有输入并且它返回一个值。你必须通过正确的输入,否则你的编译器会报错。
考虑以下功能:
Float intToFloat(Int i);
Double floatToDouble(Float f);
Real doubleToReal(Double d);
凡Int
,Float
,Double
,和Real
是用户定义的C++类型。
比方说,我需要写这个函数:
Real intToReal(Int i);
所以我只有一个Int
。以上功能中,有正好有一个函数我可以调用:intToFloat
。这个名字说明了一切:它需要一个int并将其变成一个浮点数。因此,给出Int
,只有我可以用它做的事情是拨打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。
矩阵就像这些函数一样,将位置转换为沿途的中间空间。
直到问题解决后才能回答这个问题。对一些人来说,教得好的东西对于他们来说,能够理解概念,对每个人都不会这样做。我最好的建议是在你成为3D程序员之前学会成为3D建模师。这就是我所做的。一旦熟悉了数据的可视化,就可以更容易地形成心智模型,并在脑海中进行编码。当你需要进一步的可视化来帮助你创建算法时,你将能够在不使用代码的情况下创建它们。