Войти
OpenGL communityФорум

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

Страницы: 1 2 3 4 5 6 Следующая »
#0
21:02, 5 авг. 2012

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

Это сообщение сгенерировано автоматически.

#1
21:02, 5 авг. 2012

Большое спасибо за новую статью! :)

#2
21:35, 5 авг. 2012

Всегда рад :)

#3
22:22, 5 авг. 2012

Спасибо за статью!! Надо будет наконец-то пощупать тесслеляцию :)

#4
13:17, 6 авг. 2012

bazhenovc, спасибо за статью.
Ее очень не хватало. Будем пробовать.

#5
15:56, 6 авг. 2012

а сетку можно показать?

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

#6
19:40, 6 авг. 2012

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) из вершиноого шейдера аж до фрагментного и ниразу его не использовал?


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

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

#7
20:20, 6 авг. 2012

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

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

#8
20:45, 6 авг. 2012

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

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

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

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

#9
21:10, 6 авг. 2012

bazhenovc
Лучше сделай с картой высот, у которой на краях не одинаковые значения. А то как-то совсем примитивно.

#10
21:15, 6 авг. 2012

SNVampyre
Я не хотел усложнять. Наверное в следующей статье напишу.

#11
22:22, 6 авг. 2012

В статье:

Следующий шейдер: tesselation control. Он тоже не очень интересный, принимает данные из вершинного, ставит уровни тесселяции по 64(каждая сторона патча будет разбита 64 раза) и передаёт всё это дальше в evaluation shader.

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

Получается два tesselation control и ни одного evaluation shader. По-моему либо напутано с названиями, либо с последовательностью изложения.
Комментарии в самих шейдерах тоже странные (// to control shader и // from evaluation shader).

#12
13:22, 7 авг. 2012

gkv311
> Далее у нас самый интересный шейдер - tesselation control. Его давайте
> рассмотрим по кускам.
Опечятка, исправил.

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

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

#13
15:51, 7 авг. 2012

У меня возник вопрос по статье. Вот написано:

Tesselation control shader (GL_TESS_CONTROL_SHADER) позволяет нам задавать параметры для тесселятора. Он вызывается для каждой вершины патча и имеет доступ ко всем его вершинам.

А как нам этот доступ осуществить?
Я читал в расширении GL_ARB_tessellation_shader, там сказано, что доступ к вершинам в control shader только по индексу gl_InvocationID, и любые операции с этим индексом (например (gl_InvocationID + 1)) приведут к ошибке компиляции. Как тогда получить аттрибуты соседних вершин треугольника в контрольном шейдере?

#14
16:09, 7 авг. 2012

SNVampyre
> Как тогда получить аттрибуты соседних вершин треугольника в контрольном шейдере?
Входные данные можно читать спокойно, а вот записывать данные можно только по gl_InvocationID.
upd:
Иначе зачем передавать на вход массив, если обращаться можно только к одному элементу?

Страницы: 1 2 3 4 5 6 Следующая »
OpenGL communityФорум

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