2012-04-12 80 views
0

我在Direct3D 11中绘制GUI,目前我通过在屏幕附近绘制3D四边形的负载来管理它。我决定实施屏幕四边形来提高速度。屏幕空间到剪辑空间转换问题

当我绘制我四I为它提供的输入位置(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的意见和lerped 1和-1之间的定稿y位置。 GUI元素垂直向中心移动并收缩。当他们到达中心时,他们就会缩小,然后循环。

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

编辑2:问题是背面剔除。禁用该固定一切

回答

2

反转Y轴的最简单的方法是通过减一乘它:

output.pos.y *= -1; 
+0

我刚刚也试过,出于某种原因,它仍然没有出现。 – 2012-04-12 16:48:52

+0

然后我会建议使用调试器来逐步着色器代码,并检查值是你所期望的。 如果这没有帮助(并且假设'output.pos.y * = 1;'除了Y轴反转以外工作正常),您可以尝试使用介于1和-1之间的定时lerp来帮助可视化问题。例如'output.pos.y * = lerp(1,-1,fmod(time_in_seconds,1));' – CarlJohnson 2012-04-13 01:49:33

+0

好主意。由于某些原因,PIX不能很好地与我的项目一起玩,所以我可能会使用定时的lerp。我应该在当天结束时展示一些东西 – 2012-04-13 09:22:34

1

刚刚经历了同样的问题:如果你发现四消失,这是因为可能指数收盘指令。我没有禁用背面剔除,而是扭转了四边形的缠绕顺序,一切正常。