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

问题描述 投票:0回答:2

我正在Direct3D 11中绘制GUI,目前正在通过在屏幕附近绘制3D四边形来管理它。我决定对屏幕四边形进行实例化,以稍微提高速度。

绘制四边形时,我为其提供了一个输入位置(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坐标使用旧的计算,它仍然可以工作。因此问题必须出在新代码的第二行。

非常感谢

编辑1:我现在遵循了TomMcTwattyPants的建议,并将最终y位置限制在1到-1之间。发生的情况是GUI元素垂直向中心移动并缩小。当它们到达中心时,它们就会消失,然后循环。

循环之前有一个延迟,因此我相信在乘法的0和-1部分之间,四边形是不可见的。我不确定为什么,也许顶点的顺序改变了,所以法线现在指向屏幕之外并被剔除了?我将尝试关闭背面剔除,以查看是否有任何改变。无论如何,GUI传递都不需要它。

EDIT2:问题在于背面剔除。禁用该功能可以修复所有问题

directx shader rendering hlsl
2个回答
2
投票

反转y轴的最简单方法是将其乘以减一:

output.pos.y *= -1;

1
投票

刚刚遇到了相同的问题:如果发现四边形消失,则可能是由于索引缠绕顺序所致。我没有禁用背面剔除,而是反转了四边形的缠绕顺序,一切正常。

© www.soinside.com 2019 - 2024. All rights reserved.