据我所知,opengl视口的坐标系是二维的,在x和y方向上的范围在-1到1之间。要将3DVector的位置从“世界空间”映射到你写的视口坐标f.e
片段着色器中的“gl_position = uModelViewProjectionMatrix * vPosition”。
我的问题是如何将3DVector乘以4D矩阵并获得2DVector作为结果 - 更重要的是 - 在CPU端有一个功能吗(特别是android中的java的libary / class)< / p>
答案 0 :(得分:1)
只是澄清一些条款:
gl_Position
必须在剪辑空间中使用4D向量。这是空间三角形被夹入(例如,特别是如果它们与近平面相交)。这与标准化设备坐标分开,因为尚未发生透视分割。自己这样做会pos /= pos.w
,但是这会丢失一些OpenGL对剪辑,深度和插值所需的信息。这让我想到了答案。你是对的,你不能将3D矢量乘以4x4矩阵。它实际上是使用 homogeneous coordinates ,向量是4D,最后是1
。 4D结果用于剪辑空间。光栅化器仅使用2D位置创建片段,但w
用于透视校正插值,z
插值用于深度测试。
最后,ModelViewProjection矩阵意味着引入了三个空格。这些纯粹是惯例,但有充分的理由存在。网格顶点在对象空间中给出。您可以使用模型转换矩阵在世界中放置对象。您可以使用视图矩阵在世界中提供摄像机位置和旋转。然后,投影矩阵通过缩放剪辑空间的所有内容来定义观看体积。分离视图和投影矩阵的一个原因是眼睛空间中的操作,例如照明计算。
我不会详细介绍,但希望这会让你走上正轨。
答案 1 :(得分:0)
据我所知,opengl视口的坐标系是二维的,在x和y方向的范围在-1到1之间。
排序,但不完全相同。
从数学的角度来看,重要的是内核的维度。当涉及到帧缓冲时,事物不会在视口坐标处结束。从那里得到“分裂”,(x,y)坐标用于确定要触摸的片段,(z,w)坐标通常用于最终在深度缓冲区中结束的计算。
我的问题是如何将3DVector乘以4D矩阵并获得2DVector
将3d矢量填充到4d元素;在均匀坐标方面,除了最后一个设置为1的元素之外,用零填充它。这允许你乘以n×4矩阵。要回到2d,你将它投射到较低维度的向量空间;这就像一个3d对象将二维阴影投射到一个表面上。最简单的投影只是省略了你不感兴趣的尺寸,比如去往视口时丢弃z和w。
是否有在CPU端执行此操作的功能
有几个线性代数库。只需相应地填充向量以使用更高维矩阵进行变换,并将它们投影到更低的维度。