Math 来自OpenGL的标准化设备坐标金属

Math 来自OpenGL的标准化设备坐标金属,math,matrix,3d,opengl-es,metal,Math,Matrix,3d,Opengl Es,Metal,好的,我知道这里有很多关于标准化设备坐标的问题,但是没有一个能解决我的问题 所以,我画的所有东西都是在2D屏幕坐标中指定的,其中左上角是(0,0),右下角是(屏幕宽度,屏幕高度),然后在我的顶点着色器中,我做这个计算以得到NDC(基本上,我渲染UI元素): 其中ScreenX/ScreenY是像素坐标,例如(600700),screenHalf_____;是屏幕宽度/高度的一半 对于光栅化状态,我从顶点着色器返回的最终位置是: gl_Position = vec4(ndcX, ndcY, Dep

好的,我知道这里有很多关于标准化设备坐标的问题,但是没有一个能解决我的问题

所以,我画的所有东西都是在2D屏幕坐标中指定的,其中左上角是(0,0),右下角是(屏幕宽度,屏幕高度),然后在我的顶点着色器中,我做这个计算以得到NDC(基本上,我渲染UI元素):

其中ScreenX/ScreenY是像素坐标,例如(600700),screenHalf_____;是屏幕宽度/高度的一半

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

gl_Position = vec4(ndcX, ndcY, Depth, 1.0);
这在Opengl ES中工作得非常好

现在的问题是,当我在《金属2》中这样尝试时,它不起作用

我知道Metal的NDC是2x2x1,Opengl的NDC是2x2x2,但我认为这里的深度在这个等式中并没有起到重要作用,因为我在逐顶点传递它

我试过了,但是被弄糊涂了,链接并没有那么有用,因为我试图避免顶点着色器中的矩阵计算,因为我现在渲染的是2D


所以我的问题是…在金属中把像素坐标转换成NDC的公式是什么?是否可以不使用正交投影矩阵?为什么我的方程对金属不起作用?

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

以下是我可能会用到的公式:

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
是renderbuffer的尺寸(以像素为单位),可以在缓冲区中传递给顶点着色器。您还可以预先计算比例因子,并将其传递给屏幕尺寸,以在GPU上保存一些计算。

“它不工作”?具体来说,它是如何不起作用的呢?所以,我得到的是,在视口转换之后,我放大了……但是我发现问题不在于数学,而在于我是如何配置金属可绘制层并帮助我解决问题的。这与我拥有的数学几乎相同,只是我在着色器中做的计算较少。我确实发现了为什么我认为它不起作用的问题。这与IOS中发生的本机扩展有关。我的数学是正确的,但我的视图端口和可绘制表面的设置是错误的。PS我喜欢你的金属作品。我已经用过了,很高兴你发现了这个问题。我已经修改了我的答案,以提高计算效率,但牺牲了一些可读性。
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;