Warum funzt Pixelputten mit Surface->Lock nicht???
-
Okay, wenigstens weis ich jetzt, dass ich nicht der einzige bin, bei dem's net funzt http://www.c-plusplus.net/ubb/ubb/smile.gif ! Wenn niemand das selbe Problem hatte, und es gelöst hat, mach ich's halt weiter mit SetPixel, auf meinem Celeron 500 funzen 4 x 70 Pixel + pixelgenaue Kollisionsabfrage (pro Frame!) in 1024 x 768 x 16 bit mit vollen 85 FPS (und DDraw kann bei mir seltsamerweise net schneller...), von daher reicht das (zur Not) auch aus... trotzdem wär's mir lieber, wenn die Surface->Lock-Methode funzen würde...
------------------
Mfg, D@nm@n
-
Ich denke, dass du einen Fehler
bei der Berechnung der Speicher-
Adresse machst!! Wenn du keine
Taiwanische Hardcore-NoName
Marke "Eigenbau" Grafikkarte hast, dann
denke ich wird es auch bei dir funzen!!
Das DirectDraw nicht schneller als
setPixel ist, liegt daran, dass
DirectDraw sich nach der
Hertz-Zahl des Monitors richtet, und
das ist auch gut so!! Bei großen
Draw-Aktionen wird dir auffallen, dass
DirectDraw doch schneller ist !!
Poste mir mal deinen GANZEN Code
und ich werde den Fehler finden, denn
ein Pixel in DirectDraw zu zeichnen
ist einfach!MFG
FinalBrain
-
Zitat:
Original erstellt von FinalBrain:
**Ich denke, dass du einen Fehler
bei der Berechnung der Speicher-
Adresse machst!! Wenn du keine
Taiwanische Hardcore-NoName
Marke "Eigenbau" Grafikkarte hast, dann
denke ich wird es auch bei dir funzen!!
Das DirectDraw nicht schneller als
setPixel ist, liegt daran, dass
DirectDraw sich nach der
Hertz-Zahl des Monitors richtet, und
das ist auch gut so!! Bei großen
Draw-Aktionen wird dir auffallen, dass
DirectDraw doch schneller ist !!
Poste mir mal deinen GANZEN Code
und ich werde den Fehler finden, denn
ein Pixel in DirectDraw zu zeichnen
ist einfach!MFG
FinalBrain**
He, ich hab' 'ne ATi Radeon, ich würde nicht sagen, dass das 'ne Noname GraKa ist.
Und was die Speicherbelegung angeht: Der Speicher wird doch automatisch zugewiesen, d.h. ich hab' da doch gar keinen Einfluss drauf, oder?
Ich würde wirklich gerne Pixel putten...------------------
Jesus lebt
-
Poste mir mal deinen Pixelput-Code, der
nicht geht und ich probiere dir daraus
was zu basteln, dass dann auch bei dir geht !! Kannst du denn auch nicht blitten ??MFG
FinalBrain
-
Zitat:
Original erstellt von FinalBrain:
**Poste mir mal deinen Pixelput-Code, der
nicht geht und ich probiere dir daraus
was zu basteln, dass dann auch bei dir geht !! Kannst du denn auch nicht blitten ??MFG
FinalBrain**
Code:
bool PutPixel(LPDIRECTDRAWSURFACE7 lpDDSurf, int x, int y, UCHAR Farbe)
{
int ZeilenBreite; UCHAR* Vram; DDSURFACEDESC2 surfacedesc; ZeroMemory(&surfacedesc, sizeof(surfacedesc)); surfacedesc.dwSize = sizeof(surfacedesc); lpDDSurf->Lock(NULL, &surfacedesc, DDLOCK\_SURFACEMEMORYPTR | DDLOCK\_WAIT, NULL); ZeilenBreite = surfacedesc.lPitch; Vram = (UCHAR*)surfacedesc.lpSurface; Vram[x + y * ZeilenBreite] = Farbe; lpDDSurf->Unlock(NULL); return true;
}
[/code]
Blitten geht, jedenfalls um den Puffer zu löschen...
Der Fehler muss irgendwie in der Speicheradressierung liegen...------------------
Jesus lebt
-
Weiß denn niemand einen Rat?
------------------
Jesus lebt
-
Den gleichen Code (na ja, nicht haargenau den gleichen, aber die gleiche Methode) nehm' ich auch!!! Und ich hab' ne Voodoo3, also auch keine Noname-Grafikkarte. Das mit den falschen Speicherzuweisungen kann eigentlisch ausgeschlossen werden, da ich es schon mit einigen Methoden probiert habe (siehe auch mein 1. posting!)!
Wo wir gerade beim blitten sind: Ist es eigentlich genauso schnell, einen Pixel zu blitten??? Ich brauche das ganze nämlich für einen Sternenhintergrund, da könnte ich doch auch ein 1x1 Bitmap anlegen und es blitten (oder ist da wiederum SetPixel schneller?)!?!
------------------
Mfg, D@nm@n[Diese Nachricht wurde von D@nm@n am 09-06-2001 editiert.]
-
Beim weiteren Durchlesen durch das Forum ist mir noch was aufgefallen: Müssen ZeroMemory und x = sizeof(x) immer dastehen??? Das habe ich aus Faulheit (glaube ich) immer weggelassen http://www.c-plusplus.net/ubb/ubb/rolleyes.gif...
Und noch was: Muss vor dem Unlocken nicht noch einmal (UCHAR)surfacedesc.lpSurface = Vram;* stehen???------------------
Mfg, D@nm@n
-
He, es funzt http://www.c-plusplus.net/ubb/ubb/smile.gif http://www.c-plusplus.net/ubb/ubb/smile.gif http://www.c-plusplus.net/ubb/ubb/smile.gif !!! Es lag tatsächlich an dem fehlenden ZeroMemory, etc. Ich dachte die ganze Zeit, das wäre nur eine Sicherheitsmaßname, damit die Struktur nur mit nullen initialisiert wird und nicht irgendwelche zufällige Werte hat. Das ich aber auch nie auf die Idee gekommen bin, das dazuzuschreiben, so wie es in den meisten Tutorials steht http://www.c-plusplus.net/ubb/ubb/rolleyes.gif ...
Bei der ganzen Sache gibt es nur noch ein Problem: Die Farbzuweisung!!! Ich rechne das mit folgendem Makro:
#define rgb(r,g,b) = b|(g<<5)|(r<<11), wobei r, g und b für rot grün und blau stehen.
Wenn ich jetzt "reine" Farben (also rot[255,0,0], grün[0,255,0], blau[0,0,255] oder weiß[255,255,255]) nehme, dann funzt das. Wenn ich allerdings z.B. hellgelb[255,255,100] nehme, dann bekomme ich ganz seltsame Farben, woran liegt das???PS: dieses Vram[x+yZeilenBreite]* muss bei mir (800x600x16) so heißen, damit es funzt: Vram[x+yZeilenBreite/2]*
------------------
Mfg, D@nm@n
-
Hallo,
ZeroMemory: siehe hierzu http://www.c-plusplus.net/ubb/ubb/Forum7/HTML/000688.html
http://www.c-plusplus.net/ubb/ubb/wink.gifCU
-
Genau daher hab' ich's doch http://www.c-plusplus.net/ubb/ubb/biggrin.gif http://www.c-plusplus.net/ubb/ubb/biggrin.gif http://www.c-plusplus.net/ubb/ubb/biggrin.gif !!!
------------------
Mfg, D@nm@n
-
Code:
convertRGBToColorModel(WORD wRed,
WORD wGreen, WORD wBlue)
{
DWORD dwRed; DWORD dwGreen; DWORD dwBlue; WORD wBits; DWORD dwMask; // Rot wBits=1; dwMask = dwMaskRed; while (dwMask=dwMask>>1) { wBits++; } dwRed = DWORD (wRed) << wBits; // Gruen wBits = 1; dwMask = dwMaskGreen; while (dwMask=dwMask>>1) { wBits++; } dwGreen = DWORD (wGreen) << wBits; // Blau wBits = 1; dwMask = dwMaskBlue; while (dwMask=dwMask>>1) { wBits++; } dwBlue = DWORD (wBlue) << wBits; return (((dwRed>>8)&dwMaskRed) | ((dwGreen>>8)&dwMaskGreen) | ((dwBlue>>8)&dwMaskBlue));
}
[/code]
die Masken bekommt man mit irgenwelchen DX-fkts, schau mal in die Doku...
-
Danke http://www.c-plusplus.net/ubb/ubb/smile.gif, nur geht das nicht einfacher (= ohne eigene Fkt), zum Beispiel mit einem Makro?
------------------
Mfg, D@nm@n
-
Du kannst auch Dein Makro weiterverwenden, nur solltet Du beachten, daß in einem 16 Bit Farbmodus nicht für jeden Farbanteil 256 Abstufungen(8 Bit) existieren. Du solltest Dich einfach auf die Bereiche von 0 bis 31 bzw. bei 565 auf 0 bis 31, 0 bis 63, 0 bis 31 beschränken.
Oder Du schreibst Dir noch eine Funktion die's umrechnet... Aber di hatten wir ja schon!
CU
-
Zitat:
Original erstellt von D@nm@n:
**Danke http://www.c-plusplus.net/ubb/ubb/smile.gif, nur geht das nicht einfacher (= ohne eigene Fkt), zum Beispiel mit einem Makro?**
weiss nich, obs einfacher geht, ich weiss nur, das ich das Teil so geschreiben hab, das es in allen Farbmodi funzt...
-
Also ich find Makros NICHT einfacher als Funktionen! Du hast NULL Typsicherheit und debuggen kannst du's nur extrem schwer!
-
Tja, das ist deine Meinung! Ich hab' zwischenzeitlich in jedem Fall ein vollständig funzendes Makro gefunden! Das sieht so aus:
#define rgb(r,g,b) (((r>>3)<<11)+((g>>2)<<5)+(b>>3))
Hier nochmal meine Fkt. (für alle die's interessiert):
Code:
WORD *buffer;
DDSURFACEDESC ddsd;
ZeroMemory(&ddsd,sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
if (lpDDSurface->Lock(NULL,&ddsd,DDLOCK_SURFACEMEMORYPTR|DDLOCK_WAIT,NULL) == DD_OK)
{
buffer = (WORD*)ddsd.lpSurface;
buffer[x+y*ddsd.lPitch/2] = rgb(r,g,b);
(WORD*)ddsd.lpSurface = buffer;
lpDDSurface->Unlock(NULL);
}[/code]
So, jetzt kann von mir aus jeder nochmal seinen Senf dazu geben, diese Methode funzt wunderbar bei mir, und damit bin ich zufrieden! Trotzdem nochmal total vielen Dank an alle, die mir geholfen haben (oder es zumindest versucht haben). So ein ewig langes Posting und Monate voll Frust nur wegen eines vergessenen ddsd.dwSize = sizeof(ddsd); http://www.c-plusplus.net/ubb/ubb/redface.gif. Naja, jetzt funzt's ja http://www.c-plusplus.net/ubb/ubb/smile.gif http://www.c-plusplus.net/ubb/ubb/smile.gif http://www.c-plusplus.net/ubb/ubb/smile.gif http://www.c-plusplus.net/ubb/ubb/smile.gif http://www.c-plusplus.net/ubb/ubb/smile.gif http://www.c-plusplus.net/ubb/ubb/smile.gif http://www.c-plusplus.net/ubb/ubb/smile.gif http://www.c-plusplus.net/ubb/ubb/smile.gif !!!
------------------
Mfg, D@nm@n
-
Aber was passiert, wenn nicht der 565 -colormode läuft ?!?
-
Ja, schon klar, dass das dann nicht funzt, aber lies dazu mal mein Posting in Crax' Thread (mit den Colorkeys)! Das mit dem Makro habe ich zu mindest mehr oder weniger kapiert, deine Fkt. ist mir (noch) zu viel. Mir ist schon klar, dass die finale Version meines Proggies so nicht bleiben kann, aber im Moment soll's ausreichen. Nicht böse sein http://www.c-plusplus.net/ubb/ubb/biggrin.gif http://www.c-plusplus.net/ubb/ubb/biggrin.gif http://www.c-plusplus.net/ubb/ubb/biggrin.gif http://www.c-plusplus.net/ubb/ubb/biggrin.gif !
------------------
Mfg, D@nm@n