2012-01-18 7 views
5

Я пытаюсь создать вершинный/фрагментарный шейдер каркаса в Unity. Кажется возможным в соответствии с this paper. Общие идеи, похоже, состоят в том, что вы передаете вектор расстояния, вычисленный в вершинном шейдере, каждому фрагменту в шейдере фрагмента, который он может использовать, чтобы определить, какую яркость рисовать линию каркаса в зависимости от его положения в полигоне.Можно ли получить доступ ко всем вершинам в многоугольнике в вершинном шейдере?

Из всего остального, что я прочитал, похоже, что вы получаете доступ только к одной вершине в вершинном шейдере. Мне нужен доступ ко всем соседним вершинам в многоугольнике для вершины ecah. В документе, по-видимому, подразумевается, что геометрический шейдер не нужен, что хорошо, потому что Unity еще не поддерживает их.

Что мне не хватает? Невозможно ли доступ к соседним вершинам в вершинном шейдере? Я пытаюсь сделать невозможным без геометрических шейдеров?

ответ

2

Вы, кажется, действительно имеют более читаемый этот пункт в 2.1, что говорит

Шаг G1, как правило, всегда выполняется в вершинном шейдере. Шаг G2 должен выполняться в геометрическом шейдере, поскольку геометрический шейдер имеет доступ ко всем вершинам многоугольника (при условии, что это треугольник). Следовательно, если геометрический шейдер не используется, вершинный шейдер должен получить другие вершины в качестве атрибутов, чтобы вычислить расстояния. Это подразумевает, что код приложения не является инвариантным в отношении использования метода wireframe, который должен передавать дополнительные данные , и, наконец, что использование индексированных примитивов исключено, поскольку атрибуты вершины зависят от того, какой треугольник is нарисовано.

Поэтому, когда вы не используете геометрический шейдер, вы действительно не знаете других вершин треугольника и поэтому должны передавать их в качестве дополнительных атрибутов вершин. Поэтому для каждой вершины треугольника вы получаете два дополнительных атрибута vec3, содержащих позиции двух других вершин этого треугольника. И, конечно же, как говорится в тексте, вы не можете использовать индексированный чертеж, так как эти два атрибута зависят не только от положения вершин, но и от треугольника, к которому принадлежит эта вершина.

+0

Спасибо за помощь. Знаете ли вы, что эти ограничения могут быть преодолены в движке Unity? Возможно ли передать эту дополнительную информацию в шейдере Cg, как те, которые использует Unity? Откуда будет проходить эта передача? – aardvarkk

+0

@aardvarkk Эти ограничения не могут быть преодолены, поскольку они являются ограничениями основного оборудования/интерфейса, а не языка двигателя или затенения. Вершинный шейдер имеет доступ только к одной вершине, и вам нужно дать два других атрибута этой вершины. У меня нет опыта работы с Unity, но у Cg, конечно, есть атрибуты per-vertex, и я уверен, что Unity имеет некоторые средства для предоставления пользовательских атрибутов вершин вашей модели. –

+0

@aardvarkk Итак, есть ли у вас какие-либо дополнительные вопросы относительно вашего первоначального вопроса (если вы можете обращаться к соседям в VS и если ваша цель невозможна без GS)? Вы не получите никаких других ответов от тех, кто понимает вершинные и геометрические шейдеры. Unity не имеет к этому никакого отношения, поскольку он не может магически преодолеть ограничения основного графического оборудования. –