【发布时间】:2019-02-23 06:19:38
【问题描述】:
好的,所以我知道这里有很多关于标准化设备坐标的问题,但没有一个能解决我的特定问题。
所以,我绘制的所有内容都是在 2D 屏幕坐标中指定的,其中左上角是 (0,0),右下角是 (screenWidth, screenHeight) 然后在我的顶点着色器中我进行这个计算以得到 NDC(基本上,我'm 渲染 UI 元素):
float ndcX = (screenX - ScreenHalfWidth) / ScreenHalfWidth;
float ndcY = 1.0 - (screenY / ScreenHalfHeight);
其中 ScreenX/ScreenY 是像素坐标,例如 (600, 700),screenHalf_____ 是屏幕宽度/高度的一半。
我从顶点着色器返回的光栅化状态的最终位置是:
gl_Position = vec4(ndcX, ndcY, Depth, 1.0);
这在 Opengl ES 中运行良好。
现在的问题是,当我在 Metal 2 中这样尝试时,它不起作用。
我知道 Metal 的 NDC 是 2x2x1 而 Opengl 的 NDC 是 2x2x2,但我认为这里的深度在这个等式中并没有发挥重要作用,因为我将它传递给我自己的每个顶点。
我尝试了this link 和this so question,但很困惑,并且链接没有那么有用,因为我正在尝试避免在顶点着色器中进行矩阵计算,因为我现在正在渲染所有 2D 内容。
所以我的问题...在 Metal 中将像素坐标转换为 NDC 的公式是什么?是否可以不使用正交投影矩阵?为什么我的方程式不适用于 Metal?
【问题讨论】:
-
“它不起作用”?具体来说,它是如何不起作用的?
标签: math matrix 3d opengl-es metal