Three.js: Используете собственный вершинный шейдер с MeshLambertMaterial?

Созданный на 2 дек. 2011  ·  9Комментарии  ·  Источник: mrdoob/three.js

Привет, я пытаюсь создать какой-то собственный шейдер, но я просто хочу изменить положение вершины, а не материал. В MeshLambert уже есть свет, текстура и все, что мне нужно, но я модифицирую вершины, придаю объекту органичный вид.

Кто-нибудь может указать мне направление?

Благодаря !!

Question

Самый полезный комментарий

@maurrubio вы закончили свой проект: eyes:

Все 9 Комментарий

Кто то?

Самым простым было бы создать собственный ShaderMaterial который был бы похож на lambert, просто добавив свой собственный код в вершинный шейдер.

Внутри стандартные материалы используют тот же механизм, что и ShaderMaterial, поэтому вам просто нужно скопировать и вставить код отсюда:

https://github.com/mrdoob/three.js/blob/master/src/renderers/WebGLShaders.js#L1187

Привет, @alteredq, спасибо за ответ.

Это то, о чем вы говорили?
http://www.interactiveuniverse.net/Shaders.js

Я создаю объекты из массивов, предоставленных в шейдере Ламберта, и передаю их новому экземпляру ShaderMaterial.

Таким образом я просто получаю черный материал без точечного освещения.

Почти готово ;)

Чтобы функции из стандартных материалов работали в ShaderMaterial вам также необходимо установить флаги материалов (огни, туман и т. Д.):

https://github.com/mrdoob/three.js/blob/master/src/materials/ShaderMaterial.js#L40

shaderMaterial = new THREE.ShaderMaterial( {

    uniforms:       uniforms,
    vertexShader:   vertexShader,
    fragmentShader: fragmentShader,
    lights:         true
    }); 

Это сработало !!! Большое вам спасибо, когда я закончу свою работу, я поделюсь с вами, ребята.

Еще один последний вопрос @alteredq, целью которого было также использование карты окружения в объекте, чтобы я мог дать ему текстуру. Как я могу реализовать такую ​​функцию, которую содержит MeshLambertMaterial?

Хммм. Я думаю, этого должно быть достаточно, чтобы установить правильную форму ( envMap ), а также вам нужно будет придерживаться где-то в верхней части как вершинного, так и фрагментного шейдеров #define USE_ENVMAP .

uniforms[ "envMap" ].texture = myCubeTexture;
vertexShader= [

"#define USE_ENVMAP",

"varying vec3 vLightWeighting;",

THREE.ShaderChunk[ "map_pars_vertex" ],
THREE.ShaderChunk[ "lightmap_pars_vertex" ],

...
fragmentShader = [

"#define USE_ENVMAP",

"uniform float opacity;",

...

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

Это сработало: D

Вы, ребята, действительно потрясающие, и я знаю, что разработчикам нравится видеть, что другие люди делают с их инструментами, я надеюсь, что скоро смогу завершить свой проект (это мой личный портфель, и я использую веб-сокеты для соединения пользователей в космическом интерфейсе со сферами. (каждый - отдельный проект), и пользователи перемещаются по пространству, и каждый пользователь - это отдельный динамический точечный свет, который перемещается по моим работам.

Движок довольно функциональный, теперь мне нужно больше работать над его дизайном.

Еще раз спасибо!

@maurrubio вы закончили свой проект: eyes:

Была ли эта страница полезной?
0 / 5 - 0 рейтинги