我正在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:问题在于背面剔除。禁用该功能可以修复所有问题
反转y轴的最简单方法是将其乘以减一:
output.pos.y *= -1;
刚刚遇到了相同的问题:如果发现四边形消失,则可能是由于索引缠绕顺序所致。我没有禁用背面剔除,而是反转了四边形的缠绕顺序,一切正常。