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

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

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

gammaker
> Я же говорю, вообще без вершин, атрибуты выключены. У вершинного шейдера не
> будет никаких входных данных кроме номера вершины и uniform'ов, по которым он
> будет всё генерировать на лету.

как добавить на GPU вершины динамический ?


#31
13:39, 8 авг. 2012

gammaker
Давай на текстуре и карте высот из примера сделай такую-же картинку ;)

#32
14:28, 8 авг. 2012

У меня ещё вопрос по статье.
Вот мы в контрол-шейдере пишем эти значения для выходного треугольника:

  gl_TessLevelInner[0] = inner;
  gl_TessLevelOuter[0] = outer;
  gl_TessLevelOuter[1] = outer;
  gl_TessLevelOuter[2] = outer;
Я так понимаю, gl_TessLevelInner - это количество разбиений внутри треугольника, а остальное - это на рёбрах.
И мы пишем их каждый раз для каждой из вершин треугольника, то есть для трёх вершин получится, что мы переписываем эти значения три раза:
// вершина 0
  gl_TessLevelInner[0] = vi0;
  gl_TessLevelOuter[0] = vo00;
  gl_TessLevelOuter[1] = vo01;
  gl_TessLevelOuter[2] = vo02;

// вершина 1
  gl_TessLevelInner[0] = vi1;
  gl_TessLevelOuter[0] = vo11;
  gl_TessLevelOuter[1] = vo11;
  gl_TessLevelOuter[2] = vo12;

// вершина 2
  gl_TessLevelInner[0] = vi2;
  gl_TessLevelOuter[0] = vo20;
  gl_TessLevelOuter[1] = vo21;
  gl_TessLevelOuter[2] = vo22;
Так какие из этих значений будут работать на самом деле и зачем их писать несколько раз?

#33
14:43, 8 авг. 2012

SNVampyre
> Так какие из этих значений будут работать на самом деле и зачем их писать
> несколько раз?

незачем их писать несколько раз - это значения для патча, а не для вершины

#34
14:48, 8 авг. 2012

SNVampyre
Я обновил статью, там опечатка была

if (0 == id) {
  gl_TessLevelInner[0] = inner;
  gl_TessLevelInner[1] = inner;
  gl_TessLevelOuter[0] = outer;
  gl_TessLevelOuter[1] = outer;
  gl_TessLevelOuter[2] = outer;
  gl_TessLevelOuter[3] = outer;
}

gl_TessLevel* - глобальные, как сказал innuendo - они задаются для патча.

#35
15:11, 8 авг. 2012

кстати
For triangular tessellation,  gl_TessLevelOuter[3] and gl_TessLevelInner[1] will be undefined.

#36
15:13, 8 авг. 2012

bazhenovc
Во, вот теперь понятно, спасибо.

#37
15:17, 8 авг. 2012

innuendo
Оно просто не используется. И это логично, т.к. у треугольника всё таки 3 стороны :)

#38
15:28, 8 авг. 2012

innuendo
> gl_TessLevelInner[1]

bazhenovc
> И это логично, т.к. у треугольника всё таки 3 стороны

и одно внутреннее разбиение

#39
16:55, 9 авг. 2012

>Давай на текстуре и карте высот из примера сделай такую-же картинку ;)
Будет время, попробую. Я это на практике ещё не делал.

#40
22:47, 10 авг. 2012

gammaker

ну ?

#41
9:44, 11 авг. 2012

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

#42
10:56, 11 авг. 2012

>ну ?
Подожди-ка, ещё времени не было. И оказалось, что всё-таки понадобится буфер индексов, поэтому генерировать на лету не получится...

#43
12:10, 11 авг. 2012

gammaker
> поэтому генерировать на лету не получится...

действительно, и зачем только придумали тесселяцию ? :)

#44
20:25, 12 авг. 2012

gammaker
> Подожди-ка, ещё времени не было. И оказалось, что всё-таки понадобится буфер
> индексов, поэтому генерировать на лету не получится...
Все получается, код:

// создание
glGenVertexArrays( 1, &vao );
glBindVertexArray( vao );
glBindVertexArray( 0 );

// отрисовка
glBindVertexArray( vao );
glDrawArrays( GL_TRIANGLES, 0, 6000000 );

Шейдер (за говнокод не ругать!):

const int  size = 1000;
const float  side_size = 1000.0;

int    v_id = gl_VertexID % 6;  // индекс вершины в квадрате
int    t_id = gl_VertexID / 6;  // индекс квадрата в сетке
int    x  = t_id % size;
int    y  = t_id / size;
vec2  vertex = vec2(0.0, 0.0);
  
if ( v_id == 0 )  vertex = vec2( float(x),   float(y) );    else
if ( v_id == 1 )  vertex = vec2( float(x),   float(y+1) );  else
if ( v_id == 2 )  vertex = vec2( float(x+1), float(y) );    else
if ( v_id == 3 )  vertex = vec2( float(x+1), float(y) );    else
if ( v_id == 4 )  vertex = vec2( float(x),   float(y+1) );  else
if ( v_id == 5 )  vertex = vec2( float(x+1), float(y+1) );
  
vertex /= float(size);
gl_Position = mvp * vec4( vertex * side_size, 0.0, 1.0);

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

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