屏幕空间到剪辑空间转换问题

时间:2012-04-12 14:16:33

标签: directx rendering shader hlsl quad

我在Direct3D 11中绘制了一个GUI,目前我通过在屏幕附近绘制一堆3D四边形来管理它。我决定使用屏幕四边形来提高速度。

当我绘制I quad时,我为它提供了一个输入位置(input.pos),这是一组定义四边形的坐标,如下所示:

0,0
0,1
1,0
1,1

我还传入一个实例位置,它是四边形的屏幕空间中的位置,例如

456,700

最后我传入四边形的比例,以像素为单位。因此,50x30像素的四边形将具有以下比例值:

50,40

为了将这些坐标转换为我的像素着色器的剪辑空间,我使用以下数学(我最终打算在CPU上做,但现在在顶点着色器中完成):

output.pos = float4((input.pos*2* input.instanceScale) / winSize+input.instancePos*2/winSize -1,0.25,1);

这主要起作用,一切都出现在其他地方附近,但y轴是倒置的。这是因为剪辑空间从-1到1,但是1是剪辑空间中屏幕的顶部 - 这与正常的做事方式相反。因此,解决方案应该是:

output.pos.x = 2*(input.pos.x * input.instanceScale.x + input.instancePos.x)/winSize.x -1;
output.pos.y = 1 - 2*(input.pos.y * input.instanceScale.y + input.instancePos.y)/winSize.y;

然而,当我跑这个时,我的四边形就消失了。我猜他们仍然在渲染,但在屏幕外的地方。

有人知道会出现什么问题吗?

另外,如果我保留新的output.pos.x计算但是使用y坐标的旧计算,它仍然有效。所以问题必须出在这个新代码的第二行。

非常感谢

EDIT1:我现在已经按照TomMcTwattyPants的建议,将最终的y位置在1和-1之间。会发生什么是GUI元素垂直向中心移动并缩小。当它们到达中心时,它们会缩小,然后循环。

在循环之前有一个延迟,所以我相信在乘法的0和-1部分之间,四边形是不可见的。我不知道为什么,也许顶点的顺序已经改变,所以正常现在指向远离屏幕并被剔除?我会尝试关闭背面剔除,看看是否会改变任何东西。无论如何,它都不需要GUI传递。

EDIT2:问题是背面剔除。禁用修复所有内容

2 个答案:

答案 0 :(得分:2)

反转y轴的最简单方法是将它乘以负1:

output.pos.y *= -1;

答案 1 :(得分:1)

刚遇到同样的问题:如果你发现四边形消失,可能是因为索引缠绕顺序。我没有禁用背面剔除,而是颠倒了四边形的缠绕顺序,一切正常。

相关问题