PDA

Prikaži potpunu verziju : DirectX u C#, kako odraditi fading na sprite-u?


pajics
10.12.2006, 6:29
Kao sto pise u naslovu, treba da postignem fading efekat slike u C# i DirectX-u, kako to da uradim tj. koji metod da koristim ...?

U WinForms sam uspeo da postignem Fade efekat (preko image attribute-a), ali mi se jpeg slike sporo prikazuju pa sam iz tog razloga pokusao u DirectX-u, ali tamo ne mogu da provalim kako da odradim transparency na slici...

MG-RAY
10.12.2006, 9:27
Kao sto pise u naslovu, treba da postignem fading efekat slike u C# i DirectX-u, kako to da uradim tj. koji metod da koristim ...?

U WinForms sam uspeo da postignem Fade efekat (preko image attribute-a), ali mi se jpeg slike sporo prikazuju pa sam iz tog razloga pokusao u DirectX-u, ali tamo ne mogu da provalim kako da odradim transparency na slici...

sa DX-om ne mozes jednostavno da 'prikazes' sliku, prvo treba inicijalizovati device, setovati formate...bla, bla... sta koristis, Direct3D ili DirectDraw?

Ako mislis na sporo smenjivanje slika, jednostavno ih ubaci u neku kolekciju, i odatle iscrtavaj pomocu GDI+ ...

pajics
11.12.2006, 1:09
sa DX-om ne mozes jednostavno da 'prikazes' sliku, prvo treba inicijalizovati device, setovati formate...bla, bla... sta koristis, Direct3D ili DirectDraw?

Ako mislis na sporo smenjivanje slika, jednostavno ih ubaci u neku kolekciju, i odatle iscrtavaj pomocu GDI+ ...

Direct3D, znao sam da sam nesto zaboravio da napisem :D

Ma znam da treba inicijalizovati i sve ostalo, to sam vec uradio i prikazuje mi sliku, ali imam jos jedan problem kako da ucitam pravu velicinu slike, posto sprajtovi zahtevaju da sirina i visina budu stepen dvojke (npr. slika je 1024x862, a u sprite-u pise 1024x1024). Znaci kako da otkrijem pravu velicinu i (vaznije) kako da odradim transparency (tj. da sliku prikazujem poluprovidnu)?

MG-RAY
11.12.2006, 9:45
OK, da krenemo od nule...posto pojma nemam koji si metod koristio, a cini mi se da nisi onaj koji treba... :D :D :D ...paz' sad... ;)


private Texture spriteTexture; // tekstura koju renderujes
private Sprite sprite; // ...
private Rectangle textureSize; //struktura koja cuva velicinu teksture

***
//device -- graficki uredjaj koji se koristi za crtanje.

//kreira teksturu
spriteTexture = TextureLoader.FromFile(device, @"..\..\image.bmp");

using (Surface s = spriteTexture.GetSurfaceLevel(0))
{

SurfaceDescription desc = s.Description;

//ovako se odredjuje velicina, koja ne mora da bude stepen dvojke.
textureSize = new Rectangle(0, 0, desc.Width, desc.Height);

}

sprite = new Sprite(device);

//napravi klasu u kojoj ce da se drzi pozicija spritea...ili sta vec.

//render

sprite.Begin (SpriteFlags.AlphaBlend);

//ako postoji neka lista, upotrebi foreach...

sprite.Draw(spriteTexture, textureSize, [vektor centra], [pozicija], [boja]);

sprite.End();


ako hoces, poslacu ti ceo code...

...ovo vazi samo ako tekstura koju ucitavas ima alpha informaciju.
...ako ti treba dinamicno menjanje transparencije, palo mi je na pamet da to moze da se odradi preko shadera, ali nemam pojma kako bi to radilo za crtanje spriteova...I'll see what i can do...

pajics
12.12.2006, 10:16
:) Ok ovako, to sam uradio, ono sto meni treba je dinamicko menjanje transparencije. Ovo je deo koda koji sam do sad odradio:

#region Promenljive

private Device device = null;
int mX, mY;
private Microsoft.DirectX.Direct3D.Font font;
public const int ScreenWidth = 1024;
public const int ScreenHeight = 768;
private Texture spriteTexture;
private Sprite sprite;
private Rectangle textureSize;

System.Collections.ArrayList ar = new System.Collections.ArrayList();

#endregion


public void InitializeGraphics()
{
// Create our device
device = setDevice();


// Create our texture
spriteTexture = TextureLoader.FromFile(device, @"..\..\slika.jpg");

using (Surface s = spriteTexture.GetSurfaceLevel(0))
{
SurfaceDescription desc = s.Description;
textureSize = new Rectangle(0, 0, desc.Width, desc.Height);
}
sprite = new Sprite(device);


// Create our fonts
font = new Direct3D.Font(device, new System.Drawing.Font("Arial", 12.0f, FontStyle.Regular));
}

protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{

device.Clear(ClearFlags.Target, System.Drawing.Color.CornflowerBlue, 1.0f, 0);
device.BeginScene();
sprite.Begin(SpriteFlags.AlphaBlend);

ImageInformation ii = TextureLoader.ImageInformationFromFile(@"..\..\slika.jpg");

float w = ((float)ScreenWidth / ii.Width);
float h = ((float)ScreenHeight / ii.Height);
float scale = (w > h) ? h : w;

int widthOfImage = (int)(ii.Width * scale);
int heightOfImage = (int)(ii.Height * scale);

//sprite.Draw(spriteTexture, textureSize,
//new Vector3(0, 0, 0), new Vector3(10, 10, 1), Color.White);
sprite.Draw2D(spriteTexture, Rectangle.Empty, new Rectangle(0, 0,widthOfImage - 15, heightOfImage -15), new Point(10,10), Color.White);




sprite.End();

font.DrawText(null, string.Format("X: {0} Y: {1}", mX, mY), new Rectangle(5, 5, 0, 0), DrawTextFormat.NoClip, Color.Black);
font.DrawText(null, string.Format("Texture: W {0} H: {1}", textureSize.Size.Width, textureSize.Size.Height), new Rectangle(5, 25, 0, 0), DrawTextFormat.NoClip, Color.Black);
device.EndScene();
device.Present();

this.Invalidate();

}

Gledao sam dokumentaciju i bio sam na par sajtova, ali nisam uspeo da pronadjem kako da odradim transparency tj. da postignem fading efekat na teksturi...

Sto se velicine teksture tice, problem je u tome sto mi SurfaceDescription (tj. spriteTexture.GetSurfaceLevel(x)) ne vraca tacnu velicinu sliku vec stavlja najblizu vrednost koja je stepen 2 i veca je od prave vrednosti slike...

p.s. Kako stavis kod da ti bude posebnom delu tj. da ima scroll bar? :D

MG-RAY
12.12.2006, 11:32
istio kod koji sam i ja koristio :)

zaboravi na ovo...imam ideju, pa ako ti se svidja...

...da se svaki sprite iscrvava pomocu 4 vertexa, to bi ti dalo kontrolu nad transparencijom, kao i svim drugim opcijama, pod uslovom da se renderuje pomocu shadera, probacu da odratim ovo, ne bi trebalo da bude problem...

upotrebi code tag, znak "#" (pise "umetni Code tag")

pajics
13.12.2006, 2:11
Sad ne mogu da se setim, posto sam to gledao pre jedno mesec-dva, pa sam i tada negde procitao za varijantu preko 4 vertexa, ali znam da mi se nesto nije svidela ta varijanta (da li je sporija od ove ili nesto tako...). Pa bih radije resio preko sprite-ova jer mi je to nekako logicnije (ipak za to su oni i napravljeni (2D))...

Ali ako ne znas preko sprite-ova, onda je dobrodosla bilo koja varijanta (naravno da radi :) )...

Hvala ti u svakom slucaju na trudu!

MG-RAY
13.12.2006, 21:56
hmmm...nisam siguran, trebalo bi da postizu slicnu brzinu iscrtavanja...

jedino sta mi pada na pamet je DirectDraw, ali pojma nemam kako bi se to odradilo...ili GDI+...

ipak, 4 vertexa mi se cine kao najlogicnija opcija.

quick
14.12.2006, 19:43
sprite.Draw(spriteTexture, textureSize, [vektor centra], [pozicija], [boja]);
jesi li probao da stavis [boja] parametar sa alfa vrijednoscu manjom od 1?

pajics
15.12.2006, 3:55
Nisam, ali deluje mi da moze da upali... Probacu sutra pa vam javljam jel uspelo.

MG-RAY
15.12.2006, 11:43
sprite.Draw(spriteTexture, textureSize, [vektor centra], [pozicija], [boja]);
jesi li probao da stavis [boja] parametar sa alfa vrijednoscu manjom od 1?

izgleda da si u pravu...radi. :D

pajics
16.12.2006, 18:05
Probao sam i kao sto je MG rekao RADI :)

HVALA TI!!!

MG-RAY
17.12.2006, 16:27
...ipak, ja bih se drzao shadera ... efekti su efekti :to_care: