Масштабирование отдельных треугольников (в геометрии шейдеров?) - PullRequest
0 голосов
/ 23 марта 2020

Для маскирующего объекта я пытаюсь масштабировать каждый треугольник индивидуально. Если я масштабирую объект целиком, точки, находящиеся дальше от центра, будут перемещены слишком далеко, и я просто хочу, чтобы у объекта было «больше тела». Поскольку я использую ее в качестве маски, не имеет значения, перекрываются ли треугольники.

Хотя, глядя на это, может кто-то глубоко повредить, на самом деле это то, чего я пытаюсь достичь: Example scaling 2 triangles in single mesh

Я думал, что это лучше всего сделать в шейдере, и я думал, что этого можно добиться в геометрическом шейдере, так как мне нужно знать центр треугольника. Я пришел с кодом ниже, но все продолжает действовать ... странно.

                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);
                }

Мой план состоял в том, чтобы вычислить центр треугольника и затем вычислить расстояние между центром и каждой точкой. Затем я бы взял нормаль этого расстояния, чтобы узнать, в каком направлении мне нужно переместить вершину и изменить положение, добавив шкалу расстояния * нормаль (направление) * к исходному положению вершины. Тем не менее, кажется, что треугольники меняются, когда вы поворачиваете камеру, поэтому я сомневаюсь, что это правильно. Кто-нибудь знает, что может быть не так?

(Только некоторые примечания: me sh в основном 2D, меняется только по осям X и Z (если это имеет значение). Я сделал abs (расстояние) так как я думал, что это отменит нормальное, если оба будут отрицательными. Я не уверен, если это необходимо. Я сделал масштаб -1, так как масштаб 1 привел бы к тому, что я sh остался бы тем же. Масштаб 2 должно привести к тому, что все треугольники будут в два раза больше. Я понятия не имею, что делать со значением w, но, по крайней мере, сохранение старого значения не так уж и много. Возможно, здесь кроется проблема? Я думал, что это значение должно всегда будет 1 для умножения матриц.)

1 Ответ

0 голосов
/ 24 марта 2020

Ок, так что кроме использования способа «сложной» формулы для расчета новой позиции каждой точки. (Лучше всего на 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);
                }

Это прекрасно работает:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...