Плоскости отсечения в программе просмотра кузницы не могут обрезать объекты с помощью ShaderMaterial

Я пытаюсь добавить пользовательские объекты с THREE.ShaderMaterial в forge-viewer я могу добавлять и отображать объекты в forge-viewer overlayScene,

Я отослал этот блог для добавления того же самого.

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

Я попробовал это. Но я получаю ошибку, что Cannot resolve #include<clipping_planes_pars_vertex.glsl> (то же самое для других источников шейдеров). Я попытался добавить эти шейдеры в THREE.ShaderChunk но не сработало.

Я видел, что ошибка исходит от ShaderChunk.ts потому что он не нашел шейдера в chunks[],

  1. Есть ли способ использовать плоскости отсечения с THREE.ShaderMaterial?
  2. Нужно ли добавлять свои собственные шейдеры в chunks[] от ShaderChunk.ts? Если да, то как?

Пожалуйста, поделитесь демо-примером, если это возможно.

1 ответ

Решение

Как и в случае с другим вопросом о переполнении стека, инструмент раздела в Forge Viewer использует собственную шейдерную логику, которая включена только в собственные материалы Viewer. Попробуйте включить следующие фрагменты в ваши шейдеры материала:

В вершинном шейдере:

...
#if NUM_CUTPLANES > 0
    varying vec3 vWorldPosition;
#endif
...
void main() {
    ...
    #if NUM_CUTPLANES > 0
        vWorldPosition = vec3(/* include your own vertex world position here */);
    #endif
    ...
}
...

Во фрагменте шейдера:

...
#if NUM_CUTPLANES > 0
    varying highp vec3 vWorldPosition;
#endif

#include<cutplanes>
...
void main() {
    ...
    #if NUM_CUTPLANES > 0
        checkCutPlanes(vWorldPosition);
    #endif
    ...
}
...

И при определении нового THREE.ShaderMaterialВам также необходимо включить пару специфичных для секций форм:

const uniforms = {
    ...
    "cutplanes": { type: "v4v", value: [] },
    "hatchParams": { type: "v2", value: new THREE.Vector2(1.0, 10.0) },
    "hatchTintColor": { type: "c", value: new THREE.Color( 0xFFFFFF ) },
    "hatchTintIntensity": { type: "f", value: 1.0 },
    ...
}

Посмотрите эту суть для полного примера добавления поддержки секционирования к THREE.ShaderMaterial,

Другие вопросы по тегам