Gönderen Konu: GLSL ve post ve image processing  (Okunma sayısı 4658 defa)

GLSL ve post ve image processing

« : 05.07.2007 22:11:27 »
Hızlı düğmeleri aç

chenmy1

İleti: 184

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
    • http://www.mosengine.inativa.com
Selam ,
GLSL ile Post production yapimi arastirmaktayim.Bunu Nightshiftteki Nothing de HLSL shader GLOW da ile kullanildigini gordum.Bunu nasil yapildigini anlaticak olan var mi?
 
doku kordinatlari nasil aliyorlar ?
 
elimizde Quad imiz var 5-6 tane doku kordinant aliniyor ve bunlari ile pixelin nerde cizilecegini v.s. buluyorlar elimde ornek var ama ne yaptigini anlamadim.
 
O cizdigim Pixelim nerde oldugunu nasil anliyabilirim?
Normal bildigimiz dokular
for(int y=0;yfor(int x=0;xpixelpozisyonu(x,y)
 
per pixel islem yapabiliyorsun buna benzer bi hale mi getiriliyor?
 
GLSL Türkçe bir tutorial görmek güzel olurdu..
« Son Düzenleme: 12.07.2007 12:37:50 Gönderen: chenmy1 »
Algoritmik Geometri^S!P and MEE!ditor 64/4 kb intro tool.

GLSL ve Post Production

« Yanıtla #1 : 05.07.2007 23:36:28 »
Hızlı düğmeleri aç

poison

İleti: 14

Çevrimdışı
  • *
  • Newbie
    • Profili Görüntüle
nothing'i ben yazdığıma göre sanırım bu görev bana düşüyor :)

glow işlemi için en başta usage'i render target olan 256x256 surface yaratman gerekiyor. bunlar smooth yaparken swap edilecek geçici yüzeyler.

kullanacağın shader versiyonuna göre değişmekle beraber (ben 1.1 versiyon kullanmak istediğimden 5 adımda yaptım ama yeni kartlarda daha az adımda yapabilirsin) shader içerisinde bunları smooth edecek stage'leri yazman gerekli.

stage'lere örnek olması için

struct GLOW_INPUT
{
    float4 pos : POSITION;
    float2 texCoord : TEXCOORD;
};

struct GLOW_OUTPUT
{
    float4 pos : POSITION;
    float2 texCoord0 : TEXCOORD0;
    float2 texCoord1 : TEXCOORD1;
    float2 texCoord2 : TEXCOORD2;
    float2 texCoord3 : TEXCOORD3;
};

GLOW_OUTPUT glowVSHorizontal1(GLOW_INPUT IN)
{
    GLOW_OUTPUT OUT;
   
    OUT.pos =  mul( IN.pos, texTrans );
    OUT.texCoord0 = IN.texCoord + float2(-pSize*3, 0);
    OUT.texCoord1 = IN.texCoord + float2(-pSize*2, 0);
    OUT.texCoord2 = IN.texCoord + float2(-pSize*1, 0);
    OUT.texCoord3 = IN.texCoord + float2(0, 0 );
   
    return OUT;
}

pixel glowPS(GLOW_OUTPUT IN)
{
    pixel OUT;  
   
    float4 color = tex2D( GlowSampler, IN.texCoord0 ) * 0.1;
    color += tex2D( GlowSampler, IN.texCoord1 ) * 0.3;
    color += tex2D( GlowSampler, IN.texCoord2 ) * 0.4;
    color += tex2D( GlowSampler, IN.texCoord3 ) * 0.25;
   
    OUT.color = color;
    OUT.color.a = 1.0f;
   
    return OUT;
}

şeklinde shader limitleri yüzünden vertex shader'da hangi pixellerin ortalaması alınacağını hesaplaman gerekli. pixel shader'da bu pixellerin ortalamasını alıyorsun.

glowVSHorizontal1 benzeri aynı pixel shader'ı kullanan 3 stage daha yazman gerekli, bunlar float2(-pSize*3, 0) formülünü +x,-x,+y,-y şeklinde değiştirerek 4 yönde ortalamalar alacak.

Her stage geçisinde render target'i diğeri ile değiştirip öncekini texture olarak kullanman gerekli. 4 stage'de geçtiğinde elinde ekrana çizilecek şeyin baya bir smooth edilmiş hali olacak. bu arada pSize denilen şey 0 ile 1 arasında bir rakam ki smooth oranını belirliyor. GlowSampler shader'a geçtiğin texture.

bu smooth edilmiş halini en son 5. stage'de alpha blend ile scene'in üzerine çiziyorsun. böylece objenin etrafında hafif bir glow gözüküyor.

glow için önce glow olmasını istediğin objeyi render target'lerden ilkine çiz. daha sonra 4 stage'i işletip smooth halini elde et. daha sonra render target'i framebuffer'a alıp orjinal çizimi yap ve üstüne 5. stage'de smooth edilmiş görüntüyü üzerine bindir.

(14 saattir program yazıyorum, biraz anlatamamış olabilirim, işin içinden çıkamazsan kodları gönderirim ordan bakabilirsin)

GLSL ve Post Production

« Yanıtla #2 : 06.07.2007 20:07:26 »
Hızlı düğmeleri aç

chenmy1

İleti: 184

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
    • http://www.mosengine.inativa.com
Selam,
 
Bu yazi guzel oldu Glow konusunu anlamis bulunmaktayim sagolasin.
 
Diger bir konu Edge Detect v.s. gibi shaderlar yazmak istiyorum. Render target ile ekranin dokusunu aliyorum bunu Pixel Shader a gonderiyorum.
 
Simdi bir sorun var o an isledigim Pixelin hangi pixel oldugunu nerden bilebilirim?S.A. Quad im var Pixel shader ile isleme basladigimda o an isledigim pixelin veya islem yaptigim pixelin konumu bilsem istedigim seyi yapabilecegim mesala :
 
Normal C/c++ ile dokumuz olsun:
 
yxPixelKonumu(x,y);
..
 
konumunu biliyorum boylece Yana dogru , Asagi dogru istedigim gibi islemler yapabiliyorum fakat Pixel shaderda o an islem yaptigim pixel X ve Y sini nerde oldugunu bilmiyorum?
 
Yoksa boyle bir sey mumkun degil mi?Sadece Ortalama alarak mi islem yapiyoruz?
« Son Düzenleme: 06.07.2007 20:14:27 Gönderen: chenmy1 »
Algoritmik Geometri^S!P and MEE!ditor 64/4 kb intro tool.

GLSL ve Post Production

« Yanıtla #3 : 06.07.2007 21:15:12 »
Hızlı düğmeleri aç

nightlord

İleti: 1.085

Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.nightnetwork.org
o an isledigin pixelin konumunu vertex shaderdan kendine bir texture koordinati olarak gecirebilirsin. yani bir pass te ekran boyunda bir texture'i fulll ekrana tek quad olarak gecirip quadin koselerine de kose koordinatlarini texcoord olarak gecirirsen pixel shaderda her pixeline o anki texcoordlar interpole olarak gelir.

GLSL ve Post Production

« Yanıtla #4 : 06.07.2007 22:59:57 »
Hızlı düğmeleri aç

scg_

İleti: 12

Çevrimdışı
  • *
  • Newbie
    • Profili Görüntüle
Günümüz shader dilleri texellere doğrudan integer adresli erişimi desteklemiyor. Bunun
nedeni hardware in texture mapping için özelleşmiş olması. Yani sample lara [0.0 1.0]
aralığındaki real sayılarla erişilir. Bu sayede doku çözünürlüğünden bağımsız olarak
sampling yapılıyor. Senin yazdığın o kod sampled imajlar (discrete) için. Hardware texture u
continuous farz ediyor seçtiğin filtreleme yöntemine (POINT , BILINEAR vs..) göre sampling
yapıyor.
 
Senin yapman gereken şey :
dx = 1.0 / texture_genisligi
dy = 1.0 / texture_yuksekligi
 
falan gibi şeyler tanımlayıp mesela bir (x,y) konumundaki texel in sağ üstündeki texel :
sag_ust_texel = xy + delta;
Burada delta yukardaki tanımlardan da faydalanarak
delta.x = dx;
delta.y = dy;
gibi bişeyler olur.
Ayrıca bilinear interpolasyona da gerek yok. Yani texture filtresi GL_NEAREST (point
sampling) olacak.
 
Ayrıca post production la post processing demek istedin galiba...
 
HLSL e giriş kıvamında bir yazı yazmıştım sanırım. Plazma 1 de fade in / out yazısının
içinde vardı. Orda fade in / out un post processing olarak pixel shader da nasıl
yapılabileceğinden bahsetmiştim.
 
scg / forlorn.

GLSL ve Post Production

« Yanıtla #5 : 12.07.2007 12:35:02 »
Hızlı düğmeleri aç

chenmy1

İleti: 184

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
    • http://www.mosengine.inativa.com
Selam,
Evet sanirim yanlis yazmisim duzelttim basligi ingilizce ile aram iyi degil bu yuzden ozur dilerim : "post processing" ,"image processing" farketmez bu iki islemide artik GLSL ile yapmak istiyorum yani doku olusturma , doku isleme ve ekranda genel tüm efektlerde kullanmak icin.
 
Yani sadece Post processing degil image processing ile bildiklerinizde varsa burda paylasirsaniz sevinirim..
 
Mesala eski scenerlarin Yuzde 90 ihtimalle bir doku generate etmisligi vardir.
 
Bildikleri formulleri bizle paylasirlarsa sevinirim bunlarin illa GLSL olmasi gerekmez normal bildigimiz image formatindada olabilir bizde onlari GLSL ye cevirebiliriz?
 
mesala ornek vericek olursak
void PixelBoya(int x,int y,int red,int green,int blue);
 
y++;
x++;
deger = sin(x+y)*63 + 128;
PixelBoya(x,y,deger,deger,deger);
 
v.s. :)
 
Su an bunlar ustunde ugrasiyorum bunlari GLSL ile yapmak istiyorum.Fakat formuller konusunda cok eksigim var.Bilindik formulleri buruya yazarsaniz tekrar bulmak zorunda kalmayiz diye dusunuyorum.
 
(Not: unutmadan 64kb ve 4kb icin tabiki)
Algoritmik Geometri^S!P and MEE!ditor 64/4 kb intro tool.

GLSL ve Post Production

« Yanıtla #6 : 12.07.2007 13:44:01 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
en tipik texture XOR texturedır. bu konuda pek anlatacak birşey yok, zaten sonuç da çok güzel ya da orjinal olmaz. eğer bulutumsu, dumanımsı, alevimsi texturelar oluşturmak istiyorsan;
 
http://local.wasp.uwa.edu.au/~pbourke/texture_colour/perlin/
http://dunnbypaul.net/perlin/
 
perlin noise orjinal bir texture üretme yöntemidir.

GLSL ve Post Production

« Yanıtla #7 : 12.07.2007 22:38:01 »
Hızlı düğmeleri aç

chenmy1

İleti: 184

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
    • http://www.mosengine.inativa.com
guzel siteymis bunun gibi siteler bilenler lutfen buraya linkler verebilirler mi?
Algoritmik Geometri^S!P and MEE!ditor 64/4 kb intro tool.

GLSL ve Post Production

« Yanıtla #8 : 13.07.2007 09:23:09 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
http://www.cescg.org/CESCG-2000/PBorovsky/index.html
http://www.cprogramming.com/discussionarticles/texture_generation.html
 
Eğer iyice olayın dibine vurmak istiyorsan bu tür birşey tavsiye ederim sana
http://www.amazon.co.uk/gp/product/1558608486/202-7060837-3518206?v=glance&n=266239&v=glance
 
Edit: Aklıma gelmişken bunlar bookmarklarımda olan siteler değil. Basit bir şekilde aşağıdaki linki kullanabilirsin daha fazlasına ulaşmak için ;)
http://www.google.com/search?hl=en&safe=off&q=texture+generation+algorithms
« Son Düzenleme: 13.07.2007 09:27:19 Gönderen: skate »

GLSL ve Post Production

« Yanıtla #9 : 15.07.2007 10:46:41 »
Hızlı düğmeleri aç

spritus

İleti: 933

Çevrimdışı
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://resident.tr-demoscene.info
perlin noise'un skydome ve bulutlarla uygulaması için şu url bi hayli faydalı:
http://freespace.virgin.net/hugo.elias/models/m_clouds.htm
 
ana sayfayı da ihmal etmeyin bence:
http://freespace.virgin.net/hugo.elias/