Проблема с отрицательным масштабом InstancedBufferGeometry

#three.js #shader

#three.js #шейдер

Вопрос:

В моей сцене работает InstancedBufferGeometry. Однако некоторые экземпляры являются зеркалами источника, следовательно, они имеют отрицательный масштаб для представления геометрии.

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

Я полностью осведомлен об ограничениях этого подхода, но мне было интересно, есть ли способ решить эту проблему, с которой я, возможно, еще не сталкивался? Может быть, какой-то трюк в шейдере, чтобы указать, какие из них являются лицевой стороной, а какие — задней? Я не помню, чтобы это было возможно…

Или я должен выполнять две отдельные загрузки? (Который будет дублировать вызовы рисования) Я загружаю много разных геометрий (которые все созданы), поэтому пытаюсь убедиться, что я получаю максимально возможную производительность.

Спасибо!

Муравей

[РЕДАКТИРОВАТЬ: добавлено немного больше деталей]

Ответ №1:

Было бы полезно, если бы вы привели пример. Насколько я понимаю ваш вопрос, простой ответ — нет, вы не можете этого сделать. Насколько мне известно, примитивы отклоняются до того, как они попадают в шейдер, а это означает, что это не в вашей власти. Если вы хотите использовать отрицательное масштабирование и убедиться, что поверхности все еще видны, включите рендеринг обеих граней (передней и задней). В качестве альтернативы, вы могли бы просто вращать объекты и придерживаться положительного масштаба — если вам нужно зеркальное отображение — вам здесь не повезло. Еще одна идея: у вас есть 2 экземпляра объектов, один с нормальной геометрией и один с зеркальным отображением, вы можете исправить нормали в зеркальной геометрии.

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

1. Спасибо за ваш отзыв, Травник. У меня сложилось впечатление, что это будет ответ, но, поскольку я все еще изучаю все тонкости, мне было интересно, есть ли какой-то особый соус, который я могу пропустить… В настоящее время я подумываю о том, чтобы попробовать другую тактику, поскольку наличие двух экземпляров удвоит вызовы draw, если я хочу сохранить отбраковку backface. Приветствия!