Аппаратная тесселяция и displacement mapping в OpenGL (комментарии)
Это сообщение сгенерировано автоматически.
Большое спасибо за новую статью! :)
Всегда рад :)
Спасибо за статью!! Надо будет наконец-то пощупать тесслеляцию :)
bazhenovc, спасибо за статью.
Ее очень не хватало. Будем пробовать.
а сетку можно показать?
правка: а, там карта высот оказывается, тогда не надо)
bazhenovc
Есть несколько косяков:
> gl_InvocationID номер вершины
не совсем так, в спеке написано: "contains the invocation index of the current shader" - содержит вызываемый индекс текущего шейдера, по этому индексу нужно записывать выходные значения шейдера, запись по другим индексам недопускается.
В tess_control шейдере уровень тесселяции устанавливается во всех вызовах шейдера, это не хорошо и, возможно, даже опасно: переменные gl_TessLevelInner и gl_TessLevelOuter глобальные, а шейдеры выполняются параллельно... продолжать нужно?
Я использую такой вариант:
if (gl_InvocationID == 0 ) { // устанавливаем уровень тесселяции только один раз gl_TessLevelInner[0] = ... }
Еще есть функция memoryBarrier(), но эксперименты с ней ничего не дали, в смысле проблем и без нее не было :)
Неплохо бы объяснить назначение этих строк:
> layout(vertices = 3) out;
> layout(triangles, equal_spacing) in;
И желательно всегда вызывать glPatchParameteri( GL_PATCH_VERTICES, <количество вершин> ) не смотря на то, что по умолчанию уже стоит значение 3.
gl_TessCoord.x * gl_in [0].gl_Position +
gl_TessCoord.y * gl_in [1].gl_Position +
gl_TessCoord.z * gl_in [2].gl_Position -
Почему здесь не использована функция interpolate4D?
И зачем ты тащил значение позиции (vertfs.position) из вершиноого шейдера аж до фрагментного и ниразу его не использовал?
В целом неплохо, если соберешься писать продолжение, то могу помочь.
Вообще надо бы написать про правильную стыковку патчей с разным уровнем тесселяции, отсечение невидимых патчей и примеры разных способов сглаживания, информации на английском по этой теме полно, а вот на русском маловато...
Sergio
trex
Обращайтесь :)
nukem
Сетка практически неотличима от картинки.
/A\
> gl_InvocationID номер вершины
Fixed.
/A\
>
> В tess_control шейдере уровень тесселяции устанавливается во всех вызовах
> шейдера
Да, как-то упустил. Fixed.
> Еще есть функция memoryBarrier()
Не, она в данной ситуации не нужна :)
> Неплохо бы объяснить назначение этих строк:
> > layout(vertices = 3) out;
> > layout(triangles, equal_spacing) in;
Это уже миллион раз разжевано везде, где только можно, в том числе и на русском :) Я хотел написать именно про displacement mapping, и специально в конце дал ссылку на статью с разжевыванием теории.
> И желательно всегда вызывать glPatchParameteri( GL_PATCH_VERTICES, <количество
> вершин> )
В случае если не указывать кол-во вершин в шейдере явно - да.
> Почему здесь не использована функция interpolate4D?
Потому что нам не нужна W в данном случае. Засунул interpolate3D, для наглядности.
> И зачем ты тащил значение позиции (vertfs.position) из вершиноого шейдера аж до
> фрагментного и ниразу его не использовал?
В оригинальном коде, в форвард-рендере, в фрагментный шейдер передавалось world-space position для расчёта освещения. Решил оставить, жалко выкидывать :)
> В целом неплохо, если соберешься писать продолжение, то могу помочь.
>
> Вообще надо бы написать про правильную стыковку патчей с разным уровнем
> тесселяции, отсечение невидимых патчей и примеры разных способов сглаживания,
> информации на английском по этой теме полно, а вот на русском маловато..
Ну давай скооперируемся и напишем серию статей, я только за :)
bazhenovc
> Это уже миллион раз разжевано везде, где только можно, в том числе и на русском :)
Я имел ввиду фразы типа: "устанавливает размер патча в 3 вершины" и "задает способ тесселяции треугольника - разбиение ребер на равные части". Чтобы не искать по ссылкам что же это означает.
> В случае если не указывать кол-во вершин в шейдере явно - да.
Проверял? У меня не работало с квадратами, если не вызвать glPatchParameteri( GL_PATCH_VERTICES, 4 ).
> Решил оставить, жалко выкидывать :)
Ну как хочешь. Меня это запутало сначало.
> Ну давай скооперируемся и напишем серию статей, я только за :)
ОК
bazhenovc
Лучше сделай с картой высот, у которой на краях не одинаковые значения. А то как-то совсем примитивно.
SNVampyre
Я не хотел усложнять. Наверное в следующей статье напишу.
В статье:
Следующий шейдер: tesselation control. Он тоже не очень интересный, принимает данные из вершинного, ставит уровни тесселяции по 64(каждая сторона патча будет разбита 64 раза) и передаёт всё это дальше в evaluation shader.
и потом:
Далее у нас самый интересный шейдер - tesselation control. Его давайте рассмотрим по кускам.
Получается два tesselation control и ни одного evaluation shader. По-моему либо напутано с названиями, либо с последовательностью изложения.
Комментарии в самих шейдерах тоже странные (// to control shader и // from evaluation shader).
gkv311
> Далее у нас самый интересный шейдер - tesselation control. Его давайте
> рассмотрим по кускам.
Опечятка, исправил.
gkv311
> Комментарии в самих шейдерах тоже странные (// to control shader и // from
> evaluation shader).
Чем это они странные?
EDIT: пофиксил комент в evaluation шейдере.
У меня возник вопрос по статье. Вот написано:
Tesselation control shader (GL_TESS_CONTROL_SHADER) позволяет нам задавать параметры для тесселятора. Он вызывается для каждой вершины патча и имеет доступ ко всем его вершинам.
А как нам этот доступ осуществить?
Я читал в расширении GL_ARB_tessellation_shader, там сказано, что доступ к вершинам в control shader только по индексу gl_InvocationID, и любые операции с этим индексом (например (gl_InvocationID + 1)) приведут к ошибке компиляции. Как тогда получить аттрибуты соседних вершин треугольника в контрольном шейдере?
SNVampyre
> Как тогда получить аттрибуты соседних вершин треугольника в контрольном шейдере?
Входные данные можно читать спокойно, а вот записывать данные можно только по gl_InvocationID.
upd:
Иначе зачем передавать на вход массив, если обращаться можно только к одному элементу?
Тема в архиве.