OpenGL community
GameDev.ru / Сообщества / OpenGL community / Форум / Аппаратная тесселяция и displacement mapping в OpenGL (комментарии)

Аппаратная тесселяция и displacement mapping в OpenGL (комментарии)

Страницы: 1 2 3 4 5 6 Следующая »
bazhenovcУдалёнwww5 авг. 201221:02#0
Аппаратная тесселяция и displacement mapping в OpenGL (комментарии)
Это сообщение сгенерировано автоматически.
KpeHDeJIbПостоялецwww5 авг. 201221:02#1
Большое спасибо за новую статью! :)
bazhenovcУдалёнwww5 авг. 201221:35#2
Всегда рад :)
SergioУдалёнwww5 авг. 201222:22#3
Спасибо за статью!! Надо будет наконец-то пощупать тесслеляцию :)
trexПостоялецwww6 авг. 201213:17#4
bazhenovc, спасибо за статью.
Ее очень не хватало. Будем пробовать.
nukemУдалёнwww6 авг. 201215:56#5
а сетку можно показать?

правка: а, там карта высот оказывается, тогда не надо)

/A\Постоялецwww6 авг. 201219:40#6
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) из вершиноого шейдера аж до фрагментного и ниразу его не использовал?


В целом неплохо, если соберешься писать продолжение, то могу помочь.

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

bazhenovcУдалёнwww6 авг. 201220:20#7
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 для расчёта освещения. Решил оставить, жалко выкидывать :)

> В целом неплохо, если соберешься писать продолжение, то могу помочь.
>
> Вообще надо бы написать про правильную стыковку патчей с разным уровнем
> тесселяции, отсечение невидимых патчей и примеры разных способов сглаживания,
> информации на английском по этой теме полно, а вот на русском маловато..
Ну давай скооперируемся и напишем серию статей, я только за :)

/A\Постоялецwww6 авг. 201220:45#8
bazhenovc
> Это уже миллион раз разжевано везде, где только можно, в том числе и на русском :)
Я имел ввиду фразы типа: "устанавливает размер патча в 3 вершины" и "задает способ тесселяции треугольника - разбиение ребер на равные части". Чтобы не искать по ссылкам что же это означает.

> В случае если не указывать кол-во вершин в шейдере явно - да.
Проверял? У меня не работало с квадратами, если не вызвать glPatchParameteri( GL_PATCH_VERTICES, 4 ).

> Решил оставить, жалко выкидывать :)
Ну как хочешь. Меня это запутало сначало.

> Ну давай скооперируемся и напишем серию статей, я только за :)
ОК

SNVampyreУдалёнwww6 авг. 201221:10#9
bazhenovc
Лучше сделай с картой высот, у которой на краях не одинаковые значения. А то как-то совсем примитивно.
bazhenovcУдалёнwww6 авг. 201221:15#10
SNVampyre
Я не хотел усложнять. Наверное в следующей статье напишу.
gkv311Постоялецwww6 авг. 201222:22#11
В статье:
Следующий шейдер: tesselation control. Он тоже не очень интересный, принимает данные из вершинного, ставит уровни тесселяции по 64(каждая сторона патча будет разбита 64 раза) и передаёт всё это дальше в evaluation shader.

и потом:
Далее у нас самый интересный шейдер - tesselation control. Его давайте рассмотрим по кускам.

Получается два tesselation control и ни одного evaluation shader. По-моему либо напутано с названиями, либо с последовательностью изложения.
Комментарии в самих шейдерах тоже странные (// to control shader и // from evaluation shader).
bazhenovcУдалёнwww7 авг. 201213:22#12
gkv311
> Далее у нас самый интересный шейдер - tesselation control. Его давайте
> рассмотрим по кускам.
Опечятка, исправил.

gkv311
> Комментарии в самих шейдерах тоже странные (// to control shader и // from
> evaluation shader).
Чем это они странные?

EDIT: пофиксил комент в evaluation шейдере.

SNVampyreУдалёнwww7 авг. 201215:51#13
У меня возник вопрос по статье. Вот написано:
Tesselation control shader (GL_TESS_CONTROL_SHADER) позволяет нам задавать параметры для тесселятора. Он вызывается для каждой вершины патча и имеет доступ ко всем его вершинам.

А как нам этот доступ осуществить?
Я читал в расширении GL_ARB_tessellation_shader, там сказано, что доступ к вершинам в control shader только по индексу gl_InvocationID, и любые операции с этим индексом (например (gl_InvocationID + 1)) приведут к ошибке компиляции. Как тогда получить аттрибуты соседних вершин треугольника в контрольном шейдере?
/A\Постоялецwww7 авг. 201216:09#14
SNVampyre
> Как тогда получить аттрибуты соседних вершин треугольника в контрольном шейдере?
Входные данные можно читать спокойно, а вот записывать данные можно только по gl_InvocationID.
upd:
Иначе зачем передавать на вход массив, если обращаться можно только к одному элементу?
Страницы: 1 2 3 4 5 6 Следующая »

/ Форум / OpenGL community

Тема в архиве.

2001—2018 © GameDev.ru — Разработка игр