Как я могу переместить только определенные вершины из моего вершинного шейдера?(И как их выбрать) - PullRequest
1 голос
/ 13 мая 2019

Я создал квадрат как это:

THREE.PlaneBufferGeometry (1, 1, 1, 50);

Что касается материала, я использовал шейдерный материал.

THREE.ShaderMaterial ()

В моей функции vertexShader я вызываю 2d функцию шума, которая перемещает каждую вершину моего квадрата следующим образом:

enter image description here

Но, в конце концов, я хочу, чтобы только левая сторона моего квадрата двигалась. Я думаю, что если я назову только 50 первых вершин или 1 вершину каждые 2, это должно сработать.

Вот код моего vertexShader:

void main () {

vUv = uv;

vec3 pos = position.xyz;

pos.x + = функция шума (vec2 (pos.y, время));

gl_Position = projectionMatrix * modelViewMatrix * vec4 (pos, 1.0);

}

Кто-нибудь знает, как я могу выбрать только левые боковые вершины моего квадрата? Спасибо

1 Ответ

2 голосов
/ 13 мая 2019

Вектор положения отображает положение вершины в локальном пространстве, что означает, что центр четырехугольника находится в положении (0,0).

Поэтому, если вы хотите применить эти изменения только к вершинам на левой стороне, вам необходимо проверить, является ли координата x вершины отрицательным x-пробелом.

void main() {

   vUv = uv;

   vec3 pos = position.xyz;

   if ( pos.x < 0.0 ) {
       pos.x += noiseFunction(vec2(pos.y, time));
   }

   // to avoid conditional branching, remove the entire if-block
   // and replace it with the line below
   // pos.x += noiseFunction(vec2(pos.y, time)) * max(sign(-pos.x), 0.0);

   gl_Position = projectionMatrix * modelViewMatrix * vec4(pos, 1.0);

}

IЯ использовал выражение if, чтобы прояснить, что я имел в виду, но на самом деле вы должны избегать этого.Таким образом вы предотвратите условное ветвление на GPU.

...