Войти
ПрограммированиеФорумГрафика

Градиентный шум в шейдере (демо) (2 стр)

Страницы: 1 2
#15
12:19, 9 окт. 2011

пара статей про шум перлина


#16
12:24, 9 окт. 2011

Есть ещё симплекс шум, вроде даёт неплохие результаты на шейдрах (быстрее перлина). Перлин хорош тем что позволяет делать бесшовные текстуры:)

Кстати, ещё существуют какие-либо шумы кроме перлина на шейдрах? Если всё объединить получится неплохой генератор если уж не текстур то detail текстур.

#17
13:55, 9 окт. 2011

Загуглите libnoise, там много интересного. Ну и оно опенсорсно.

#18
13:58, 9 окт. 2011

Я имел ввиду что-то типа libnoise, но на GPU:) Единственный классный генератор - это Genetica, но она на .NET и рендер довольно заторможенный. Предназначена только для того, чтобы заранее синтезировать текстуру в битмап.

Тот же шум перлина в ней можно рендерить секунд 5, а на шейдре у меня на той же машине этот шум генерится за 30 миллисекунд (и это джифорс 6-ти летней давности).

Я знаю ещё fxgen, но интерфейс не впечатляет, а кол-во багов ой как впечатляет.

#19
17:36, 9 окт. 2011

я когда делал генератор шума для огонька. за основу взял перлин.

sRandom1,sRandom2 - базовые текстуры у меня 32x32 генерю обычным рандомом единичных векторов.
fTime - время.  переход от sRandom1 к sRandom2. диапазон 0...1.  при 1 просто sRandom1=sRandom2 и генерю новую sRandom2.  с учетом времени получается 3д(xyt)


на выходе обычно делаю текстуру 128x128.
результатом в 'rgb' получается градиент по xyt, а 'a'  само значение.
это всего только 1 октава.

#version 330 core

uniform sampler2D sRandom1;
uniform sampler2D sRandom2;
uniform float fTime;

in vec2 tCord;
out vec4 color0;

void main()
{ 
  vec2 delta,invdelta;
  vec3 fT;
  vec2 iT;
  vec3 fade;
  vec3 fade_d;
  vec3 x1,x2;
  float y1,y2;
  float z1,z2;
  float w;
  float d1,d2;
  vec3 y1m,y2m;
  vec3 z1m,z2m;
  vec3 wm;

  delta = vec2(textureSize(sRandom1,0).xy); 
  invdelta =1.0/delta;
  fT =vec3( modf(tCord*delta,iT),fTime);



  fade = fT * fT * fT * ( fT * ( fT * 6.0f - 15.0f ) + 10.0f );
  fade_d = fT * fT * (fT*(30.0*fT-60.0)+30.0);

//  fade.z = fTime;
//  fade_d.z = 1.0;

  iT *= invdelta;
  iT += invdelta*0.5;

  x1 = texture2D(sRandom1, iT  ).rgb;
  d1  = dot(x1,fT);
  x2 = texture2D(sRandom1, iT + vec2(invdelta.x,0.0) ).rgb;
  d2 = dot(x2,fT-vec3(1.0,0.0,0.0));
  y1 = mix( d1, d2, fade.x );
  y1m = mix(x1, x2, fade.x);
  y1m.x += (d2-d1)*fade_d.x;


  x1 = texture2D(sRandom1, iT + vec2(0.0,invdelta.y) ).rgb;
  d1  = dot(x1,fT-vec3(0.0,1.0,0.0));
  x2 = texture2D(sRandom1, iT + vec2(invdelta.x,invdelta.y) ).rgb;
  d2 = dot(x2,fT-vec3(1.0,1.0,0.0));
  y2 = mix( d1,d2, fade.x );
  y2m = mix(x1, x2, fade.x);
  y2m.x += (d2-d1)*fade_d.x;

  z1 = mix( y1,y2,fade.y);
  z1m = mix( y1m, y2m, fade.y );
  z1m.y +=(y2-y1)*fade_d.y;  

  x1 = texture2D(sRandom2, iT  ).rgb;
  d1  = dot(x1,fT-vec3(0.0,0.0,1.0));
  x2 = texture2D(sRandom2, iT + vec2(invdelta.x,0.0) ).rgb;
  d2 = dot(x2,fT-vec3(1.0,0.0,1.0));
  y1 = mix( d1, d2, fade.x );
  y1m = mix(x1, x2, fade.x);
  y1m.x += (d2-d1)*fade_d.x;

  x1 = texture2D(sRandom2, iT + vec2(0.0,invdelta.y) ).rgb;
  d1  = dot(x1,fT-vec3(0.0,1.0,1.0));
  x2 = texture2D(sRandom2, iT + vec2(invdelta.x,invdelta.y) ).rgb;
  d2 = dot(x2,fT-vec3(1.0,1.0,1.0));
  y2 = mix( d1, d2, fade.x );
  y2m = mix(x1, x2, fade.x);
  y2m.x += (d2-d1)*fade_d.x;

  z2 = mix( y1,y2,fade.y);
  z2m = mix( y1m, y2m, fade.y);
  z2m.y +=(y2-y1)*fade_d.y;  

  w = mix( z1,z2,fade.z);
  wm = mix( z1m, z2m, fade.z );
  wm.z +=(z2-z1)*fade_d.z;  
/*
  w = abs(wm.z);
  w *=0.5;
  w = clamp(w,0.0,1.0);
  vec3 color = vec3(w ,w ,w );
  color = vec3( abs(wm.xy)*0.5,0.0 );
  //color = clamp(color,0.0,1.0);
*/
  color0 = vec4(wm.xyz, w);

}


результат использования
Untitled-3 | Градиентный шум в шейдере (демо)
Untitled-8 | Градиентный шум в шейдере (демо)
Untitled-7 | Градиентный шум в шейдере (демо)

#20
17:42, 9 окт. 2011

uniform sampler2D sRandom1;
uniform sampler2D sRandom2;

немного напрягает

В шейдре можно использовать текстурные координаты вместо рандомной текстуры. А seed просто добавлять к текстурным координатам для получения уникальной текстуры.

Проверил симплекс. По скорости то же самое что перлин, хотя его шейдр значительно проще..

#21
20:29, 9 окт. 2011

Добавил к шуму градиентную текстуру и уже кое-что вытанцовывается:
Изображение

uniform sampler2D gradient;
const int steps = 5;
void main( void )
{
  float n = 0;
  int i;
  float mul2 = 0.5, mul = 4.0;
  for(i=1;i<=steps;i++)
  {
    n += pnoise((gl_FragCoord.xy)/512.0*mul, vec2(mul))*mul2;
    mul *= 2;
    mul2 *= 0.5;
  }
  gl_FragColor = texture2D(gradient, vec2(n,0.0));
}
gradient - заранее подготовленная текстурка с градиентом.
#22
17:17, 10 окт. 2011

RPG
Похожий эффект

gl_FragColor=fract(n*5);
Подсмотрел тут

Свой шейдер переписал на GLSL - производительность упала на 5%. Скачать можно тут (шейдеры переключаются клавишами 1 и 2).

#23
17:24, 10 окт. 2011

murder
> Похожий эффект
ну да это просто такой градиент - повторяющиеся полосы.

Производительность в моём случае составляет где-то 25 фпс для текстуры 512 на 512 с детализацией 5, с большей детализацией ещё хуже.

Писать шейдр сразу на асме - лучше убиться:) я пока его отлаживал пол-дня прошло. На очереди блюр гаусса

Страницы: 1 2
ПрограммированиеФорумГрафика

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