» »

VC++ in DirektDraw

VC++ in DirektDraw

Red_Mamba ::

Jou!

Končno mi je uspelo ustvarit direkt draw objekt.
No zdej mam Primary in Overlay surface.

Sive lase mi pa dela naslednja:
Kako naj sedaj spravim kako sliko na to površino?
Imam BMP 256baru pa bi rad prikazal nad oknom.

Je še kaka druga možnost risanja al sam z BMP?
Delam namreč visual plugin za winamp pa mi je prejšnji način delal prepočasi (bitblt bmp na okno).

Vsakršna pomoč je dobrodošla:D

Senitel ::

DirectDraw načeloma zna samo kopirat svoje surface (kar pa zna delat zelo hitro). Po teh surfaceih lahko rišeš na dva načina z GetDC (GDI) in Lock. Če hočeš torej naložit BMP je najbolje, da ga naložiš z GDI-jem, potem pa ga BitBlt-jaš na DC od surface-a (ko loadaš ga spraviš na en offscreen surface). Pa sej ne rabiš overlay surface-a... Rabiš samo offscreen surface...

Jest bi ti priporočal, da zraven zaženeš še Direct3D (al pa greš recimo na DirectX 8.0, kjer sploh ni več Direct Draw-a - dosti manj zafrkancij). Potem pa lahko rišeš čist kar kol ti paše.
Pa še neki: če hočeš da plugin dela na software-u ostan na DirectX 7.0, ker DirectX 8.0 nima veš softwareskega renderiranja.

Zgodovina sprememb…

  • spremenil: Senitel ()

Red_Mamba ::

Ja hmmmm...

Zdej rišem direkt na primary z getDC
sem pa tud bmp slikal na primary s. pa je hitrost obupna.

s offscreen surface mam še probleme ker mi ga ne kreira, zmeri se mi sesuje WinAMP.

Zanima me zdej naslednje:
Recimo, da se mi bo prkazala marija pa mi bo uspelo offscreen surface ustvarit.
Zdej pa dam na njega BMP, potem jo pa bit-am na primary.
kako pa potem na tem offscrenu pikselom barvo popravljam?

Senitel ::

Ne... Ti nardiš primary surface in en offscreen surface. Potem pobereš DC od offscreen surface-a in gor prekopiraš un BMP. Potem pa samo še BltFastaš na primary surface... Piksle pa lahko potem plotaš z Lock (kjer dobiš direkt pointer na pomnilnik, kjer se ta surface nahaja). Dej povej kero verzijo DD uporabljaš?

Red_Mamba ::

sem naredil primary in en offscreen
potem oba pobarvam črno z blt funkcijo
potem pa rišem z dc na offscreen, ko ba bltfast-am na primari dobim pa belo-črne horizontalne črte.
tak da mi neki ne štima

g_lpddsPrimary->BltFast(config_x,config_y,g_lpddsBackTwo,&r,DDBLTFAST_DESTCOLORKEY); //Moja bltfast funkcija za offscreen na primari ki da čb črte.

ne uporabljam MFC-ja ampak sam API funkcije

prosu bi te če mi napišeš zgled za lock in unlock funkcijo za en surface .

Na c. mam DX8.

Senitel ::

Dej izključ destcolorkey če ne rabiš transparentnosti... Pa pol povej če dela tko kot bi mogu (pa dej magar primary surface blt-j z črno, offscreen surface pa z eno drugo barvo).

Z lockom se pa dela tko (nujno moraš vedet format pixlov - spodnji primer deluje pri 32bitni globini...):
DDSURFACEDESC ddsd;
lpSurface->Lock(NULL,&ddsd,DDLOCK_WAIT | DDLOCK_WRITEONLY);
DWORD* pPixel=(DWORD*)((BYTE*)ddsd.lpSurface+ddsd.lPitch*y+x*4);
*pPixel=(red<<16) | (green<<8) | blue;
lpSurface->Unlock(NULL);

kjer sta x,y koordinati pixla, red, green ter blue barva (vsaka spremenljivka je velika en byte).

Red_Mamba ::

No sej tisto foro z črtami sem pol najdu.
spremenljivka RECT je kazala na napačno mesto in se je čisto drugi del spomina preslikaval.
Tako da mi zdej vse dela.
Ker sem mel resolucijo na 16-ih bitih se mi je najprej čudno zdelo kako da je treba x pomnožit z 2 in ne z 4 kot si napisal. Zdej sm pa na 24bitov nastavil in lahka RGB uporabljam.

Mel bi še eno vprašanje: recimo zdej najprej Lock-am površino jo narišem dam unlock potem pa DC do te iste površine zato da lahko črte narišem (movetoex/lineto). Se da direkt črto narisat na offscreen surface?

Nekateri efekti (računanje po krogu) mi kljub temu delajo počasi (hitreje kot prej ko nisem mel DD)
a obstajajo tud kake fore za hitro računanje
za rotiranje točk okoli neke točke in take fore?
Bi se za take reči bolje obnesel direct3d?

Senitel ::

Samo na hitro:
Ja D3D bi delal hitreje, še posebej če bi za risanje črt uporabil 3D pospeševanje (lahko rišeš tudi 2D črte - pospešeno)... Da ne omenjamo tega, da jih lahko potem še teksturiraš in podobno...
Če te zanima startup koda za D3D mi maili un source file, ki ga imaš zdej za DD sem.

Red_Mamba ::

zakaj pa moj source nucaš?

Senitel ::

No sej v bistvu mi sam povej ker interface uporabljaš (LPDIRECTDRAW7 upam...)

Red_Mamba ::

Zaenkrat LPDIRECTDRAW, ker mislim, da nimam podpore za 7-ko. Mi bo pa kolega DL iz mikrosoftove strani SDK od DirectX8. Upam da bojo knjižnice za VC++ zravn.

Senitel ::

Ker SDK maš pa zdej?

Red_Mamba ::

tist k je zrav vc++
verzije nebi vedu je pa kr star, no vglavnem drug teden dobim frišnega

sem pa že mal tud MMX in 3DNow ukaze gledal
in glede na to da mam AMD-ja mi bo 3DNow prav prišel saj ima podporo za vektorsko "matematiko"

Senitel ::

Zraven VC++ 6.0 je DX 3...


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Grafična kartica in HD filmi

Oddelek: Kaj kupiti
262405 (1911) pviran3
»

DivX player (soft)

Oddelek: Programska oprema
9936 (824) MRtwister
»

Media player clasic 6.4.7.6 prašanje

Oddelek: Programska oprema
61050 (986) Tugo
»

Podnapisi na TV

Oddelek: Zvok in slika
51084 (926) MChuk
»

Multi monitor overlay

Oddelek: Sedem umetnosti
61058 (965) SasoS

Več podobnih tem