Я пытаюсь создать шейдер с текстурной картой с нуля. Глядя на другие материалы (шейдеры) и их источники, кажется, что всем им передан атрибут «uv». Мне трудно понять, где создается и назначается этот атрибут uv. Настраивается ли он на геометрию, материал или и то, и другое?
Я использую объекты THREE.Geometry по умолчанию, например THREE.SphereGeometry
. Я предположил, что для них уже установлены атрибуты, но когда я проверяю их сетки как дочерние элементы сцены, я не вижу, чтобы для них был установлен какой-либо ключ/значение атрибута.
Это пример шейдера, сгенерированного ShaderMaterial
или другим:
Вершинный шейдер
attribute vec2 uv;
varying vec2 vUv;
void main() {
vUv = uv;
Фрагментный шейдер
varying vec2 vUv;
uniform sampler2D map;
void main() {
vec4 texel = texture2D( map, vUv );
Однако, когда я пытаюсь выполнить описанное выше, мой шейдер (с RawShaderMaterial) просто становится пустым, и я получаю сообщение «не удалось скомпилировать».
Есть ли какая-то магия в THREE, которая устанавливает связь между шейдером, объектом и атрибутами?
Я нашел вопрос THREE.js генерирует UV-координату, но опять же, я предполагаю ТРИ объекта по умолчанию уже имеют правильно установленные атрибуты UV?
В этом случае я специально хочу использовать RawShaderMaterial. Может ли кто-нибудь указать мне место в источнике THREE, где создаются UV для объектов/передаются в шейдеры, или подскажите, как правильно настроить UV для использования во фрагменте/вершине во время выполнения?