我正在 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 坐标使用旧计算,它仍然有效。所以问题一定出在这个新代码的第二行。
非常感谢
EDIT1:我现在听从了 TomMcTwattyPants 的建议,并在 1 和 -1 之间确定了最终的 y 位置。发生的情况是 GUI 元素垂直向中心移动并缩小。当它们到达中心时,它们会消失,然后循环。
循环之前有一个延迟,所以我相信在乘法的 0 和 -1 部分之间,四边形是不可见的。我不确定为什么,也许顶点的顺序已经改变,所以法线现在指向远离屏幕并被剔除?我会尝试关闭背面剔除,看看是否会改变任何东西。无论如何,GUI 通行证都不需要它。
EDIT2:问题是背面剔除。禁用它可以解决所有问题