缩放单独的三角形(在几何着色器中?)

Scaling seperate triangles (in geometry shader?)

对于遮罩对象,我试图单独缩放每个三角形。如果我将对象作为一个整体进行缩放,那么远离中心的点将移动得太远,我只希望对象具有 'more body'。因为我用它作为遮罩,三角形是否重叠并不重要。

虽然看着这个可能会伤害到内心深处的某个人,但这实际上是我想要实现的目标:

我认为这最好在着色器中完成,而且我认为这可以在几何着色器中实现,因为我需要知道三角形的中心。我想出了下面的代码,但事情一直在发生……很奇怪。

                float3 center = (IN[0].vertex.xyz + IN[1].vertex.xyz + IN[2].vertex.xyz) / 3;


                for (int i = 0; i < 3; i++)
                {
                    float3 distance = IN[i].vertex.xyz - center.xyz;
                    float3 normal = normalize(distance);
                    distance = abs(distance);
                    float scale = 1;
                    float3 pos = IN[i].vertex.xyz + (distance * normal.xyz * (scale - 1));
                    o.pos.xyz = pos.xyz;
                    o.pos.w = IN[i].vertex.w;
                    tristream.Append(o);
                }

我的计划是计算三角形的中心,然后计算中心与每个点之间的距离。我会取这个距离的法线来知道我必须在哪个方向移动顶点并通过将距离*法线(方向)*比例添加到顶点的原始位置来改变位置。然而,当你旋转相机时,三角形似乎发生了变化,所以我怀疑这是否正确。有谁知道哪里出了问题?

(只是一些注意事项: 网格基本上是二维的,仅在 x 轴和 z 轴上发生变化(如果这很重要)。 我做了 abs(distance) 因为我认为如果两者都是负数它会抵消法线。我不确定这是否有必要。 我做了 scale -1 因为 1 的比例会导致网格保持不变。比例为 2 应该导致所有三角形都大两倍。 我不知道如何处理 w 值,但至少保留旧值不会搞砸那么多。也许这就是问题所在?我认为对于矩阵乘法,这个值应该始终为 1。 )

Oke,所以除了用'complex'公式的方式来计算每个点的新位置。 (更好的方法是 https://math.stackexchange.com/questions/1563249/how-do-i-scale-a-triangle-given-its-cartesian-cooordinates)。我发现它确实以某种方式与 w 值有关。我一直认为这主要是一个辅助变量,如果有人能解释一下这个值是如何搞砸的,那就太棒了。

无论如何,将该值包含在方程式中就可以了。


                float4 center = (IN[0].vertex.xyzw + IN[1].vertex.xyzw + IN[2].vertex.xyzw) / 3;

                for (int i = 0; i < 3; i++)
                {
                    float scale = 2;
                    float4 pos = (IN[i].vertex.xyzw * scale) - center.xyzw;
                    o.pos.xyzw = pos.xyzw;
                    tristream.Append(o);
                }

这很好用:)