【问题标题】:Normalized Device Coordinate Metal coming from OpenGL来自 OpenGL 的标准化设备坐标金属
【发布时间】: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/Sc​​reenY 是像素坐标,例如 (600, 700),screenHalf_____ 是屏幕宽度/高度的一半。

我从顶点着色器返回的光栅化状态的最终位置是:

gl_Position = vec4(ndcX, ndcY, Depth, 1.0);

这在 Opengl ES 中运行良好。

现在的问题是,当我在 Metal 2 中这样尝试时,它不起作用。

我知道 Metal 的 NDC 是 2x2x1 而 Opengl 的 NDC 是 2x2x2,但我认为这里的深度在这个等式中并没有发挥重要作用,因为我将它传递给我自己的每个顶点。

我尝试了this linkthis so question,但很困惑,并且链接没有那么有用,因为我正在尝试避免在顶点着色器中进行矩阵计算,因为我现在正在渲染所有 2D 内容。

所以我的问题...在 Metal 中将像素坐标转换为 NDC 的公式是什么?是否可以不使用正交投影矩阵?为什么我的方程式不适用于 Metal?

【问题讨论】:

  • “它不起作用”?具体来说,它是如何不起作用的?
  • 所以,我在视口转换后放大了我得到的结果....但是我发现这不是数学问题,而是我如何配置 Metal drawable herehere 层帮助我弄清楚了。

标签: math matrix 3d opengl-es metal


【解决方案1】:

当然可以不用投影矩阵。矩阵只是应用转换的有用便利。但重要的是要了解它们在出现这种情况时是如何工作的,因为使用一般正交投影矩阵会执行不必​​要的操作来获得相同的结果。

以下是我可能使用的公式:

float xScale =  2.0f / drawableSize.x;
float yScale = -2.0f / drawableSize.y;
float xBias = -1.0f;
float yBias =  1.0f;

float clipX = position.x * xScale + xBias;
float clipY = position.y * yScale + yBias;

其中drawableSize 是渲染缓冲区的尺寸(以像素为单位),可以在缓冲区中传递给顶点着色器。您还可以预先计算比例因子并传递它们而不是屏幕尺寸,以节省 GPU 上的一些计算。

【讨论】:

  • 这与我的数学几乎相同,只是我在着色器中进行的计算更少。我确实发现了为什么我认为它不起作用的问题。它与 IOS 中发生的本机缩放有关。我的数学是正确的,但是我对视口和可绘制表面的设置是错误的。 PS 我喜欢你在 Metal 上的工作。我真的用过。
  • 很高兴您发现了这个问题。我已经修改了我的答案,以提高计算效率,但牺牲了一些可读性。
猜你喜欢
  • 1970-01-01
  • 2017-06-13
  • 1970-01-01
  • 1970-01-01
  • 2012-08-09
  • 2020-02-06
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多