(Direct3D 9) Graka zeichnet im vollbildmodus farbige streifen
-
Hey hou!
Ich schreib grad ein recht simples programmchen, das nicht viele ansprüche an die graka stellt, und sogut wie auf jedem rechner funktionieren soll.
Nun hab ich meiner meinung nach alles vollkommen richtig initialisiert, es werden auch keine fehler gemeldet, weder während des compilliervorgangs, noch während der laufzeit.
trotzdem erscheint auf dem bildschirm irgendein wirres zeug, es sieht so aus, als würde die graka 1-2 pixel breite bruchstücke von allen fenstern in verschiedenen auflösungen zeichnen, die vorm programmstart zu sehen sind. Dadurch entstehen nur hässliche flimmernde streifen, von den erwünschten primitiven ist gar nix zu sehen. Auf einigen anderen grafikkarten funktioniert das programm dagegen einwandfrei...Wurde schon jemand mal mit so einem problem konfrontiert? Falls es der fall sein soll, wäre ich für einen ratschlag sehr dankbar!
Hier ist ausserdem ein ausschnitt aus der logfile, vielleicht findet hier jemand einen fehler, den ich übersehen hab:
Device creation parameters:
AdapterOrdinal 0
DeviceType DEVTYPE_HAL
hFocusWindow 460044
BehaviorFlags SOFTWARE_VERTEXPROCESSINGPresent parameters:
Width, Height 1024 x 768
BackBufferFormat X8R8G8B8
BackBufferCount 1
MultiSampleType None
MultiSampleQuality 0
SwapEffect SWAPEFFECT_DISCARD
hDeviceWindow 460044
Windowed FALSE
EnableAutoDepthStencil TRUE
AutoDepthStencilFormat D24X8Flags:
LOCKABLE_BACKBUFFER no
DISCARD_DEPTHSTENCIL yes
DEVICECLIP no
VIDEO noFull_Screen_
RefreshRateInHz 60
PresentationInterval DEFAULTKann das sein, dass einige dieser parameter sich nich vertragen? Muss ich bei solchen einstellungen auf etwas besonders achten? thx an alle im voraus

greets
Andrey
-
Leerst du den Bildspeicher auch mit IDirect3DDevice9::Clear()?
-
jup
an so kleinigkeiten kanns gar nich scheitern, wie gesagt: auf anderen graka's funzts perfekt...
...
...*edit:
und das liegt jetzt nicht daran, dass es auf einem 15 jahre alten rechner nich läuft oder sowas^^ die graka verkraftet sonst alles mögliche angefangen mit quake III bis zu GTA VC... zwar nicht _das_ allertollste/allerneuste, aber wo quake läuft muss auch der dreck laufen, den ich da zusammenbastle...
-
Andrey schrieb:
jup
an so kleinigkeiten kanns gar nich scheitern, wie gesagt: auf anderen graka's funzts perfekt...
...
...sag das der graphikkarte;), wenn du mit dem argument kommst, dann muesste es ueberall laufen.
es gibt nunmal undefinierte dinge z.b. was passiert wenn du 2d zeichnest aber nie den zbuffer den du angelegt hast loescht.was sagt denn die debugausgabe von d3d?
-
sag das der graphikkarte
das hab ich, aber die wollte nich zuhören

was sagt denn die debugausgabe von d3d?
Aaja... die debugausgabe... ist auch noch so eine schräge geschichte

D3DX9D.lib und DXERR9.lib sind eingebunden, Direct3D ist im Debug-Modus, ergebnis: der vertex buffer kann nicht gesperrt werden[was sonst einwandfrei klappt]!!! (fragt nicht nach dem "wieso", ich hab kA was da abgeht). Bei dieser konfiguration gibts nicht einmal farbige streifen...deswegen arbeite ich die ganze zeit mit der retail-version von direct3D

können diese symptome irgendwie zusammenhängen?
-
also, ich meine, was für eine todsünde soll ich denn an dieser stelle begangen haben????

pVertexBuffer->Lock(0,0,(void**)(&pLockedVertexBuffer), D3DLOCK_DISCARD);
-
überschreibst du den _ganzen_ buffer?
hFocusWindow 460044
hast du das hardgecodet!?
-
ganzer buffer? jojo, tue ich... aber was bringts, wenn der ned ma gesperrt werden kann?
hardgecodet???
nein... so bekloppt bin ich (noch) nich
des iss nur zum vergleich da, weil dieser parameter irgendwie zwei mal übergeben werden muss...
-
du bist lustig;) D3D sagt dir dass da was nicht stimmt, du erzaehlst uns aber unwichtiges zeug wie "Nun hab ich meiner meinung nach alles vollkommen richtig initialisiert, es werden auch keine fehler gemeldet, weder während des compilliervorgangs, noch während der laufzeit", obwohl du weisst dass dir d3d in den nacken springt *lol*.
fix dein problem, in der doku sollte stehen weshalb welche fehler auftreten, koennte an falscher groesse, format oder flags liegen, dass du nicht locken kannst.
-
Stell D3D auf Debug-Modus (DirectX Control Panel)!
Dann wirst du mit Tonnen von Informationen in der Debug-Ausgabe überschüttet.
Musst dir dann nur noch das raussuchen, wo er meckert.
-
D3DLOCK_DISCARD:
This is a valid option when using dynamic textures, dynamic vertex buffers, and dynamic index buffers.ähm, okay, jetzt, wo ich nochma drauf hingewiesen wurde, fällt mir auf, dass d3dlock_discard nicht mit normalen vertexbuffern verwendet werden kann. Das steht in meinem buch. das steht in der doku. alle scheinen zu wissen, dass das nicht geht.
aber DX hält sich leider nicht dran
Immerhin hat dieser offensichtlich fehlerhafte code auf 2/3 (!!!) der GraKA's einwandfrei funktioniert
wie sollte ich denn auf die idee kommen, in dem codeschnipsel nach fehlern zu suchen? 
Es ist echt n bissl schwierig zu lernen, wenn man für fehler nicht konsequent, sondern nachm zufallsprinzip "bestraft" wird...naja... egal... tut mir leid leute, bin nächstes mal aufmerksamer

Vielen dank für den tipp!edit:
ach ja übrigens...a) ich hab d3dx9d.lib gelinkt
b) ich hab die konfiguration auf debug eingestellt
c) ich habe Direct3D in den debugmode versetzt
d) ich hab die debug-ausgaben auf maximum hochgeschraubtich lass die anwendung ganz normal "ausführen", und werde jetzt trotzdem nicht von "tonnen von informationen überschüttet"...
was mach ich denn da falsch
?
-
Andrey schrieb:
aber DX hält sich leider nicht dran

ja und gott haellt sich nicht daran dass jeder der ohne zu schauen ueber die strasse laeuft dann auch plattgefahren wird...
microsoft denkt sich doch diese abhaengigkeiten nicht aus um dann einfach nur jeden der die regeln bricht zu bestrafen. es ist einfach nur eine eigenschaft auf die man sich geeinigt hat, wenn ein treiberhersteller das als optimierung nutzen moechte, kackt dein programm halt ab.
Es ist echt n bissl schwierig zu lernen, wenn man für fehler nicht konsequent, sondern nachm zufallsprinzip "bestraft" wird...
stell einfach deinen compiler und dein d3d auf debug und entwickel nicht in release/retail, dann wirst du bestraft, dafuer sind die modis da.
@tomas
den tip gab es hier schon und er hatte darauf auch schon geantwortet
-
..mal eine Frage zwischendurch.. wo befindet sich das DirectX Control Panel und wie kann ich D3D auf den Debugmodus umstellen?(Falls es hilft, ich nutze Visual C++ 2005 Express Edition und das DirectX SDK von Februar)
Danke im Voraus!
-
Start > Programme > Microsoft DirectX SDK > DirectX Utilities > DirectX Control Panel
-
oh man, wo ist der smiley, der sich mit dem hammer auf den kopf haut??
danke!
-
iop schrieb:
...und wie kann ich D3D auf den Debugmodus umstellen?...
das ist mir mittlerweile klar, das habt ihr mir schon mal vor etwa nem halben jahr erklärt
, nur irgendwie wars da schon zu spät, weil ich zu dem zeitpunkt alle fehler mit der logfile und den ganzen "DXGetError..."-funktionen grad wieder ausgebeult hab...aber wo landen denn jetzt die ganzen ausgaben von DX, der ja eigentlich andauernd "meckern" sollte, wenn fehler vorhanden sind? In dem "debug" fensterchen erscheint bei mir (hab MS VS 6.0) zumindest gar nichts...

-
Auch die Debug Libs gelinkt?
-
Andrey schrieb:
a) ich hab d3dx9d.lib gelinkt
b) ich hab die konfiguration auf debug eingestellt
c) ich habe Direct3D in den debugmode versetzt
d) ich hab die debug-ausgaben auf maximum hochgeschraubtwas für debug lib_s_ gibts denn sonst noch?

-
#define D3D_DEBUG_INFO
aber wenn du gar keine debugausgabe bekommst, wird das auch net viel helfen.
hab MS VS 6.0
welche sdk version hast du?
MS hat den support für MSVS6 nämlich eingestellt...
-
"Microsoft DirectX SDK 9.0 Update Summer 2004" heisst das ganze bei mir...
MS hat den support für MSVS6 nämlich eingestellt...
bedeutet das jetzt, dass MSVS 6.0 sich selbst sabotiert?

-
hm, mit summer 2004 sollte es afaik eigentlich gehen...