Повернуть экземпляр в вершинном шейдере - PullRequest
0 голосов
/ 31 января 2020

Я изучаю геометрию экземпляра буфера и пытаюсь расширить шейдер LambertMaterial для поворота каждого экземпляра.

  #define LAMBERT
  mat4 rotationX( in float angle ) {
    return mat4(    1.0,        0,          0,          0,
            0,  cos(angle), -sin(angle),        0,
            0,  sin(angle),  cos(angle),        0,
            0,          0,            0,        1);
  }

  mat4 rotationY( in float angle ) {
    return mat4(    cos(angle),     0,      sin(angle), 0,
                0,      1.0,             0, 0,
            -sin(angle),    0,      cos(angle), 0,
                0,      0,              0,  1);
  }

  mat4 rotationZ( in float angle ) {
    return mat4(    cos(angle),     -sin(angle),    0,  0,
            sin(angle),     cos(angle),     0,  0,
                0,              0,      1,  0,
                0,              0,      0,  1);
  }

        // instanced
        attribute vec3 instanceOffset;
        attribute vec3 instanceColor;
        attribute vec3 instanceRotation;
        varying vec3 vLightFront;
        varying vec3 vIndirectFront;
        #ifdef DOUBLE_SIDED
            varying vec3 vLightBack;
            varying vec3 vIndirectBack;
        #endif
        #include <common>
        #include <uv_pars_vertex>
        #include <uv2_pars_vertex>
        #include <envmap_pars_vertex>
        #include <bsdfs>
        #include <lights_pars_begin>
        #include <color_pars_vertex>
        #include <fog_pars_vertex>
        #include <morphtarget_pars_vertex>
        #include <skinning_pars_vertex>
        #include <shadowmap_pars_vertex>
        #include <logdepthbuf_pars_vertex>
        #include <clipping_planes_pars_vertex>
        void main() {
            #include <uv_vertex>
            #include <uv2_vertex>
            #include <color_vertex>
            // vertex colors instanced
            #include <beginnormal_vertex>
            #include <morphnormal_vertex>
            #include <skinbase_vertex>
            #include <skinnormal_vertex>
            #include <defaultnormal_vertex>
            #include <begin_vertex>
            // position instanced
            transformed += instanceOffset;
            #include <morphtarget_vertex>
            #include <skinning_vertex>
    #include <project_vertex>
    mvPosition =  rotationX(250.0) * rotationY(90.0) * rotationZ(25.0) * vec4(position, 1.0);
            #include <logdepthbuf_vertex>
            #include <clipping_planes_vertex>
            #include <worldpos_vertex>
            #include <envmap_vertex>
            #include <lights_lambert_vertex>
            #include <shadowmap_vertex>
    #include <fog_vertex>
        }
        `

После копания в Google я перешел к чему-то похожему, но он их вообще не вращает , Они все находятся в одной позиции с любым числом, которое я ввожу.

Не знаю, является ли это правильным преобразованием. Как правильно расширить шейдер, чтобы добавить вращение?

1 Ответ

1 голос
/ 31 января 2020

При использовании THREE.InstancedMe sh вы можете использовать рендеринг экземпляров для всех встроенных материалов и независимо преобразовывать каждый экземпляр. Посмотрите на следующий пример, демонстрирующий этот подход:

https://threejs.org/examples/webgl_instancing_dynamic

Идея состоит в том, чтобы использовать InstancedMe sh .setMatrixAt () чтобы установить локальное преобразование для каждого из ваших экземпляров в вашей анимации l oop.

Если вы все еще хотите по какой-то причине использовать InstancedBufferGeometry, вы можете использовать следующий пример в качестве шаблона кода:

https://threejs.org/examples/webgl_buffergeometry_instancing_lambert

Показывает, как вы улучшаете MeshLambertMaterial с помощью рендеринга в инстансе.

three.js R113

...