Смещение вершины на сфере ломает сетку

Я пытаюсь создать простой шумовой эффект на сфере с помощью шейдеров. Я попытался использовать перлиновый шум Ашимы, но эффект оказался не таким, как я ожидал, поэтому я создал свой собственный шейдер на основе Phong.

пользовательский шейдер Фонга с неработающим смещением

Вот что я получаю с этим кодом в своем вершинном шейдере:

attribute int index;
uniform float time;

vec3 newPosition = position + normal * vec3(sin((time * 0.001) * float(index)) * 0.05);

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

где index — индекс вершины, а time — текущее прошедшее время.

Шумовой эффект именно такой, как я ожидал, но сферическая сетка открыта...

Как я могу сохранить этот эффект и оставить сетку сферы закрытой?


person Jordan    schedule 01.09.2015    source источник
comment
Можем ли мы увидеть фрагментный шейдер? Лично я не понимаю, как только преобразование положения вершины может создать артефакт белого цвета. За исключением случаев, когда вы очищаете экран до белого. Таким образом, проблема либо в другой части вашего вершинного шейдера, либо во фрагментном шейдере.   -  person VB_overflow    schedule 04.09.2015


Ответы (1)


Скорее всего, ваша сфера содержит повторяющиеся вершины. Избавьтесь от них, и ваш шейдер будет работать хорошо. Или избавьтесь от зависимости вашего шейдера от «index».

person game development germ    schedule 01.09.2015
comment
Это стандартная сферическая геометрия Three.js. - person Jordan; 01.09.2015
comment
Попробуйте закомментировать * float(index)) * 0,05. Если дырки исчезнут, тогда Three.js содержит дерьмовую сферу. - person game development germ; 01.09.2015
comment
Если я это сделаю, я отменю эффект волны и получу только глобальный масштаб. Но да, дырка исчезнет... - person Jordan; 01.09.2015
comment
Ok. Попробуйте использовать position.x+position.y+position.z вместо index. - person game development germ; 01.09.2015
comment
О!... Отличная идея... Завтра попробую - person Jordan; 02.09.2015
comment
Тогда единственный способ — избавиться от дубликатов вершин. - person game development germ; 02.09.2015
comment
Нравится импорт улучшенной геометрии сферы из Blender? Можно ли разобрать три сферы js? Потому что сфера 40x40 содержит 1681 вершину, а не 1600... - person Jordan; 02.09.2015
comment
Я не в THREE.js, но из беглого просмотра его документации я могу предположить, что вы можете создавать пользовательскую геометрию и копировать в нее существующую геометрию, а также выполнять различные промежуточные обработки геометрии. Например, можно копировать только уникальные вершины, строить отображение старых (неуникальных) индексов в новые (уникальные) и копировать обновленные треугольники соответственно с новыми индексами. - person game development germ; 02.09.2015