Да. В последних версиях tr.js r90^
имеет API, который можно использовать для изменения поведения встроенных материалов с помощью GLSL.
Это непросто сделать, но был сделан пример:
https: // github .com / mrdoob / three.js / pull / 14174
В основном встроенные материалы основаны на шаблонах шейдеров, которые являются просто упорядоченным списком операторов #include
.
Некоторые из этих «кусков» содержат некоторый код, который выглядит так
/*...*/ texture2D( foo, vUv ) /*...*/
Где foo
- alphaMap
, map
, specularMap
и т. д. Это означает что поиск текстуры выполняется на этом семплере, в интерполированном атрибуте uv. Вам все равно, что предшествует этому коду или что следует за ним (это может быть только точка с запятой ;
или маска .xy
).
Итак, что вы хотите сделать какое-то смещение или способ, которым выполняет тр.js, применить преобразование mat3.
Таким образом, GLSL должен выглядеть следующим образом
texture2D( foo, foo_transform * vUv )
Затем проблема становится поставкой шейдера эта форма. В этом примере выполняется немного грубой силы, сначала компилируя шейдер, а затем просматривая всю вещь (в противном случае вы должны знать, в каких кусках искать этот поиск текстуры).
Это гораздо лучшее решение, чем изменение текстур, и на самом деле должно быть проще, чем писать пользовательские ShaderMaterial
.
Отказ от ответственности - три на самом деле не предназначены для использования таким образом, но могут быть. Так, например, в то время как каждая карта имеет префикс somethingMap
, альбедо-карта не является, и ее просто называют map
, если это albedoMap
, регулярное выражение в этом примере было бы проще.
Комментарий от Imantas указал мне на использование [FromQuery] для модели представления, которая теперь выглядит следующим образом:
public class DetailsQuery
{
[Required]
public int? ClockNumber { get; set; }
[Required]
public int? YearFrom { get; set; }
[Required]
public int? YearTo { get; set; }
[FromQuery]
public bool CheckHistoricalFlag { get; set; } = false;
}
Метод контроллера теперь:
[AllowAnonymous]
[HttpGet("/api/employees/{clockNumber:int}/calendar/{yearFrom:int}/{yearTo:int}")]
public ActionResult Get([FromRoute]DetailsQuery query)
{
return Ok();
}
, который работает как ожидалось.
Спасибо за указатель Imantas.