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

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

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

/A\
Ты про массивы что-нибудь слышал? :)


#46
20:56, 12 авг. 2012

SNVampyre
> Ты про массивы что-нибудь слышал? :)
Это какя-то устаревшая техника? :)

#47
21:18, 12 авг. 2012

/A\
> Это какя-то устаревшая техника? :)

> 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) );
Это индусская вариация на тему массивов.

#48
21:43, 12 авг. 2012

SNVampyre
> Это индусская вариация на тему массивов.
Я это по быстрому писал, тем более массивы в шейдерах бывают медленее if'ов.


Кстати, новая статья по тесселяции: http://www.gamedev.ru/community/ogl/articles/dynamic_terrain_tess

#49
6:34, 13 авг. 2012

  А чё это рисунок к статье такой ненатуральный? Получше сделать нельзя было? Вот то же самое с parallax occlusion mapping-ом:
Изображение
  Разница очевидна. Так что нафита тут нужна тесселяция непонятно.

#50
10:26, 13 авг. 2012

Zefick
Поверни свой рисунок на такой же угол, как мой кубик.

Второй момент - мне лень было его освещать, для этого надо карта нормалей, tangent/binormal... Может позже обновлю.

#51
12:58, 13 авг. 2012

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

/A\
О, так ты придумал, как без индексов сделать! Класс. Я бы оптимизировал твой набор if'ов. Вместо

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) );
написал бы:
const int offsets[6]={0.0, 0.0, 1.0, 1.0, 0.0, 1.0};
vec2 vertex=vec2(float(x+offsets[v_id]), float(y+1-offsets[5-v_id]));
Тогда шейдер вообще маленький получится. И без ветвлений. Только нормали бы надо посчитать (хотя, в крайнем случае, их можно рассчитать при загрузке и хранить в текстуре).

А кстати, дублирование вершин в 1,5 раза не слишком накладно для скорости, если вершинный шейдер будет примерно средней сложности для ландшафта и с расчётом нормалей? Или оно компенсируется отсутствием чтения из VBO?

>Я это по быстрому писал, тем более массивы в шейдерах бывают медленее if'ов.
Почему? Ветвления же очень тормозные, а у тебя в среднем будет целых 3 проверки. А массив - это просто чтение из памяти плюс дополнительные вычисления.

#52
13:15, 13 авг. 2012

bazhenovc
> Второй момент - мне лень было его освещать, для этого надо карта нормалей,
> tangent/binormal... Может позже обновлю.
  Воооот. Мораль - тесселяция без нормалмаппинга хуже, чем нормалмаппинг без тесселяции :)

#53
13:21, 13 авг. 2012

/A\
> Я это по быстрому писал, тем более массивы в шейдерах бывают медленее if'ов.

подробнее :)

#54
18:56, 13 авг. 2012

gammaker
innuendo
У меня были случаи когда использование даже маленький константный массив вызывал сильное падение ФПС, в несколько раз большее чем PCF  сглаживание, точную причину я не знал, поэтому с неохотой использую массивы.
Проблем не возникает если использовать uniform вместо const, тогда получается что-то вроде static.
А вообще я планировал использовать квадраты:

const int  side_pow = 10;  // 2^10 = 1024 vertices in grid side
int quad_id = gl_VertexID >> 2;  // quad index in grid
int vert_id = gl_VertexID & 3;  // vertex index in quad
int x = quad_id & (1<<side_pow);
int y = quad_id >> side_pow;
vec2 vertex = vec2( float(x + (vert_id & 1)), float(y + (vert_id>>1)) );
Нет ни if'ов, ни массивов, даже делений нет :)
#55
11:52, 21 авг. 2012

/A\
> У меня были случаи когда использование даже маленький константный массив
> вызывал сильное падение ФПС

нельзя ли точнее, какой именно пример и на каком железе ?

#56
13:27, 21 авг. 2012

innuendo
> нельзя ли точнее, какой именно пример и на каком железе ?
Ну например, посмотри шейдер view_tesslevel.prg из демки по ландшафту, там константа vec3 vColors[4] объявленна как uniform, а в первой версии было const.
Сейчас протестировал: с uniform 1880 FPS, с const 880 FPS.
Видеокарта GTX 460.

#57
13:34, 21 авг. 2012

/A\
> Ну например, посмотри шейдер view_tesslevel.prg из демки по ландшафту, там
> константа vec3 vColors[4] объявленна как uniform, а в первой версии было const.
>
> Сейчас протестировал: с uniform 1880 FPS, с const 880 FPS.
> Видеокарта GTX 460.

сделал const static на Radeon - fps не изменился :)

#58
14:36, 21 авг. 2012

innuendo
> сделал const static на Radeon - fps не изменился :)
error C7552: OpenGL does not allow usage of keyword 'static'
А на NV такое не работает.

#59
14:43, 21 авг. 2012

/A\
> > сделал const static на Radeon - fps не изменился :)
> error C7552: OpenGL does not allow usage of keyword 'static'
> А на NV такое не работает.

упс, ошибочка вышла - не туда посмотрел :)

просто const и fps не меняется

помнишь, gather работал не так как надо - решил проблему ?

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

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