Gönderen Konu: çizim problemi  (Okunma sayısı 10717 defa)

çizim problemi

« : 31.08.2012 22:12:25 »
Hızlı düğmeleri aç

paradox

İleti: 134

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
terraini texture ile boyama için şu şekilde bir yöntem denedim.
2 adet ana texture var ve bunların r,g,b,a değerlerine göre shader yardımıyla textureleri çizdiriyorum..
Bunun için bu ana textureleri fareye basıldığı anda seçilen renk değeriyle çizdiriyorum..
kırmızıysa kırmızıya ait texturu çiziya maviyse mavi..
buraya kadar düşündüğüm gibi oldu..Fakat o an düşünüemediğim bi problem çıktı şimdide..
Textureleri çiziyorum fakat ARGB olarak alfa kanalındanda texture var (2 adet ana texture için 4+4 8 tane texture var )
Bunların alfasını değiştiremiyorum:)..
Yani textureler mesela R = 255 ise kırmızı için verdiğim texture aynen basılıyo..
Alfa olayını yapamadım..

Benim uygulama:
 http://g1208.hizliresim.com/10/z/chmwj.jpg

Yapmak istediğim olay:

http://e1208.hizliresim.com/10/z/chn63.jpg
« Son Düzenleme: 31.08.2012 22:16:49 Gönderen: paradox »

çizim problemi

« Yanıtla #1 : 31.08.2012 22:22:21 »
Hızlı düğmeleri aç

paradox

İleti: 134

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
çizim işlemide şu şekilde:
Kod: [Seç]

...

INT get = (TexLock.Pitch * y) + (x * 4);

switch(BRUSH)
{
case 1:
    {        r=255;
            a=0;
            g=0;
            b=0;
   
    }
    break;
case 2:
    {        g=255;
            a=0;
            r=0;
            b=0;
   
    }
    break;
case 3:


    {        g=0;
            a=0;
            r=0;
            b=255;
   
    }
    break;
case 4:
    {        a=255;
            g=0;
            r=0;
            b=0;
   
    }
break;

}
               Bits[ get++ ] =b;
                Bits[ get++ ] =g;
                Bits[ get++ ] = r;
               Bits[ get++ ] = a;


               
            }
           
        }
       
        F->UnlockRect(0);
    }






çizim problemi

« Yanıtla #2 : 01.09.2012 09:24:54 »
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/
Sen anladığım kadarıyla her bir 8 bitlik kanalı bir texture ifade edecek şekle getirmişsin. Kullanım biçimin pek alışık olmadığım bir biçim. Ama bu durumda sanırım yapman gereken 4 kanalın değerlerini opacity değeri olarak kullanmak. Yani;

R = 100
G = 255
B = 0
A = 150

olduğu durumda 1. textureın alphası 100, 2. texture'ın tamamen opak, 3. texture tamamen şeffaf (kapalı, etkisiz eleman), 4. texture'ın alphası 150 gibi kullanmaya çalışıyorsun, doğru mudur? Bu durumda belki de shader tarafında hesaplatabilirsin bu değerleri. Pseudo code ile;

OutputTexture.R = (Texture1.R * Transparency.R + Texture2.R * Transparency.G + Texture3.R * Transparency.B + Texture4.R * Transparency.A) / 4
OutputTexture.G = (Texture1.G * Transparency.R + Texture2.G * Transparency.G + Texture3.G * Transparency.B + Texture4.G * Transparency.A) / 4
OutputTexture.B = (Texture1.B * Transparency.R + Texture2.B * Transparency.G + Texture3.B * Transparency.B + Texture4.B * Transparency.A) / 4
OutputTexture.A = 255

şeklinde shader tarafında manuel olarak blend edebilirsin. Ama tamamen yanlış anlamış da olabilirim tabii ki. Senin "R = 255 ise kırmızı için verdiğim texture" lafından yola çıkarak böyle bir çözüm önerdim.

çizim problemi

« Yanıtla #3 : 01.09.2012 12:04:35 »
Hızlı düğmeleri aç

paradox

İleti: 134

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
Doğru anlamışsında , blend'i eski basılan pixellerein değerlerine göre yapması gerekmezmi?..
Mesela üstteki resimde zemin kaplaması olan (duvar texturu) Alfa kanalının 255 olduğu durum..
Bunu yeni RGBA değeri için misal :
r =100;
g=0;
b=0;
a = value;
şimdi bu value'yi sürekli arttırdığımda (255 e kadar) istediğim karışım oranını elde ediyorum..
mesela değeri her defasında arttırarak çizdiğimde elde ettiğim sonuç:
http://a1209.hizliresim.com/11/1/cj35q.jpg
Resimdeki olay a ve r kanalı için bi deneme..
Dediğim gibi Altaki Alfa kanalına ait texture ve üstüne bastığım Red kanalının texturu..
Tabi altakinnin alfa olduğunu biliyorum yani bu sadece deneme amaçlı
value'yi arttırdığımda resimdeki gibi karıştırma olayı oldu..
Bende bunu sonradan şu şekilde denedim..Fareye basma anında eski pixel değerlerini okuyacak sonra yeni değerlerle karıştırıcak..
senin yukarda verdiğin örnek gibi bir durum işte..
Fakat fareye sürekli basıldığından ve for döngüleri + hesaplatmalardan  olsa  gerek Bu olayı Tam istediğim gibi yapmıyor..Renkler karışıyor.

yani aynı örneği şu şekilde denedim..
r =100;
g=0;
b=0;
a = eski_a1 + value;
sonuç:)
http://f1209.hizliresim.com/11/1/cj3pl.jpg
« Son Düzenleme: 01.09.2012 12:13:52 Gönderen: paradox »

çizim problemi

« Yanıtla #4 : 01.09.2012 12:34:50 »
Hızlı düğmeleri aç

paradox

İleti: 134

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
HLSL kodu..

Kod: [Seç]
float4 TerrainPS(float2 TileTexCoord : TEXCOORD0,float4 projTex : TEXCOORD3) : COLOR
{
   

    float4 colMap = tex2D(ColourMapSampler, TileTexCoord).rgba; //terrain ANA texturu
    float4 colMap2 = tex2D(ColourMapSampler2, TileTexCoord).rgba; //2.terrain ANA texturesi
   
   
   
//1.nin rgba si
    float3 textureColor1 = (tex2D(t0Sampler, TileTexCoord*4).rgb*colMap[0] + //red
                            tex2D(t1Sampler, TileTexCoord*4).rgb*colMap[1] +
                            tex2D(t2Sampler, TileTexCoord*4).rgb*colMap[2] +
                            tex2D(t3Sampler, TileTexCoord*4).rgb*colMap[3] );
//2.nin rgba si
    float3 textureColor2 = (tex2D(t4Sampler,TileTexCoord*4).rgb*colMap2[0] +
                            tex2D(t5Sampler,TileTexCoord*4).rgb*colMap2[1] +
                            tex2D(t6Sampler,TileTexCoord*4).rgb*colMap2[2] +
                            tex2D(t7Sampler,TileTexCoord*4).rgb*colMap2[3] );//alfa 2-2


   
    textureColor1 += textureColor2;


//fırça texturu
    float CursorScale = 24;

   
    projTex.xy /= 2;            
    projTex.x =  -0.5f*projTex.x + 0.5f;
    projTex.y = 0.5f*projTex.y + 0.5f;


    float4 cursorColour = tex2D(FircaSampler,projTex);
    textureColor1.rgb += cursorColour;
   
   
    return float4(textureColor1, 0);
}

« Son Düzenleme: 01.09.2012 12:39:43 Gönderen: paradox »