Three.js . MeshPhongMaterial имеет форму, называемую diffuse. Почему она не отображается и не может быть установлена?

#three.js

#three.js

Вопрос:

В Three.js я внимательно смотрю на glsl источник для MeshPhongMaterial. Я заметил, что фрагментный шейдер полагается на uniform named diffuse . Однако, похоже, нет никакого способа ее установить. Существует также uniform named color , который можно установить и который действительно изменяет то, что выглядит как diffuse color. Да?

Каким-то образом color скопирована в diffuse underground the hood? Может ли кто-нибудь разгадать эту загадку для меня.

Ответ №1:

Если вы посмотрите или выполните поиск в источнике, вы обнаружите, что она установлена на основе color материала

Например, здесь

Комментарии:

1. Ах, хах! Подождите. Почему средство визуализации устанавливает состояние материала. За это явно должны отвечать Material и его подклассы. Нет? Приветствия.

Ответ №2:

MeshPhongMaterial не является подклассом ShaderMaterial , хотя они оба расширяются Material .

Внутренне WebGLRenderer отслеживает / знает, как справиться с двумя разными вещами:

  1. с любой формой. ShaderMaterial В любом случае Это означает, что вы можете сделать точную копию, MeshPhongMaterial используя ShaderMaterial и вместо того, чтобы myMaterial.color у вас было myMaterial.uniforms.color .
  2. «Встроенные» материалы и их свойства. Для этого WebGLRenderer известно обо всех возможных свойствах, которые проявляют эти материалы. Gman указал, где в коде это происходит (одно из мест). Для каждого материала WebGLRenderer внутренне создается ShaderMaterial , но вместо того, чтобы обрабатывать его форму, как это было бы с любым другим подобным материалом, он вручную отслеживает и обновляет все.

Встроенные материалы не имеют особого смысла, поскольку вы можете легко переходить foo.bar к foo.uniforms.bar с помощью геттеров и установщиков, оставляя средство визуализации работать только с шейдерными материалами.

Если вы действительно хотите, чтобы форма была создана для встроенного материала, вам нужно подождать, пока средство визуализации не создаст их, и вы можете подключиться к этому процессу с помощью material.onBeforeCompile = shader=>{} ( shader объект будет содержать форму).

Комментарии:

1. Вау. Большое спасибо. Царапание головки прекратилось.

2. Мой никогда не останавливался, лол, я не вижу смысла в этом дизайне.

3. Возможно, это окажется полезным medium.com/@pailhead011 /…