ThreeJS передает координаты uv в RawShaderMaterial?

Я пытаюсь создать шейдер с текстурной картой с нуля. Глядя на другие материалы (шейдеры) и их источники, кажется, что всем им передан атрибут «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 для использования во фрагменте/вершине во время выполнения?


person Andy Ray    schedule 02.12.2014    source источник
comment
Он только говорит, что не может скомпилировать? Не могли бы вы скинуть тест куда-нибудь?   -  person mrdoob    schedule 02.12.2014
comment
Я сделал этот jsfiddle.net/4wkFu/125, который действительно работает, так что я просто что-то не так в моей настройке.   -  person Andy Ray    schedule 02.12.2014