+- +-

Benutzer

Welcome, Guest.
Please login or register.
 
 
 
Forgot your password?

Autor Thema: Frage zum Hardware Render Mode (DirectX9.0c)  (Gelesen 3196 mal)

kokunze

  • Abteilungstrident
  • Buchstabenmillionär
  • Beiträge: 1.167
    • Profil anzeigen
Frage zum Hardware Render Mode (DirectX9.0c)
« am: 28. November 2006, 16:56:41 »
Hab grad festgestellt das meine kleine Anwendung mit SOFTWARE_VERTEXPROCESSING arbeitet. Hab ich zum Anfang mal zum Testen eingestellt und dann vergessen wieder zu ändern. Nun hab ich das Ganze auf HARDWARE_VERTEXPROCESSING umgestellt mit dem Resultat das nix mehr gerendert wird. Die Anwendung läuft zwar fehlerfrei, aber nur noch Texte werden angezeigt. Alle Objekte werden nicht mehr gerendert. Das gleiche Reslutat gibts, wenn ich auf MIXED_VERTEXPROCESSING umstelle. Ich benutze keinerlei "Sonder-Features" wie Anti Aliasing oder sowas.

Daher wollte ich mal fragen, zu welchen Standard Eigenschaften der Hardware Mode inkompatibel ist, bzw was es sonst sein kann.
Hier mal alle relevanten Daten meiner Anwendung:

m_ColorFormat = D3DFMT_R5G6B5;
m_DepthStencilFormat = D3DFMT_D16;
m_dwVertexProcessing = D3DCREATE_MIXED_VERTEXPROCESSING;
m_MultiSampling= D3DMULTISAMPLE_NONE;
m_dwAnisotropy= 0;
 
...

ZeroMemory(&m_PresentParameters, sizeof(m_PresentParameters));

m_PresentParameters.Windowed=false;         
m_PresentParameters.SwapEffect=D3DSWAPEFFECT_DISCARD;
m_PresentParameters.EnableAutoDepthStencil=true;
m_PresentParameters.AutoDepthStencilFormat=m_DepthStencilFormat;
m_PresentParameters.hDeviceWindow=m_hWnd;
m_PresentParameters.BackBufferWidth=m_dwWidth;
m_PresentParameters.BackBufferHeight=m_dwHeight;
m_PresentParameters.BackBufferFormat=m_ColorFormat;
m_PresentParameters.MultiSampleType= m_MultiSampling;      
m_pD3DObject->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,m_hWnd,m_dwVertexProcessing,&m_PresentParameters,&m_pD3DDevice)

...

for(unsigned i = 0;i < 8;++i)
{
 m_pD3DDevice->SetSamplerState(i,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);
 m_pD3DDevice->SetSamplerState(i,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
 m_pD3DDevice->SetSamplerState(i,D3DSAMP_MIPFILTER,D3DTEXF_ANISOTROPIC);
 m_pD3DDevice->SetSamplerState(i,D3DSAMP_MAXANISOTROPY,m_dwAnisotropy);
}

 m_pD3DDevice->SetRenderState(D3DRS_AMBIENT,RGB(255,255,255));
 m_pD3DDevice->SetRenderState(D3DRS_LIGHTING,false);
 m_pD3DDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);      
 m_pD3DDevice->SetRenderState(D3DRS_ZENABLE,D3DZB_TRUE);   

 m_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
 m_pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
 m_pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
 m_pD3DDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);

...

 g_App.GetDevice()->SetRenderState(D3DRS_SLOPESCALEDEPTHBIAS, F2DW(g_fSlopeBias));
 g_App.GetDevice()->SetRenderState(D3DRS_DEPTHBIAS, F2DW(g_fBias*(float)i));
 g_App.GetDevice()->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,i*8,0,8,0,12);      

Mongrel

  • Trident Vollmitglied
  • Labermonster
  • Beiträge: 482
    • Profil anzeigen
Re: Frage zum Hardware Render Mode (DirectX9.0c)
« Antwort #1 am: 29. November 2006, 08:49:14 »
Ich nehme mal an, dass das mit Deinen VertexBuffern zu tun hat. Gib mal den Code mit dem Du die erzeugst.

kokunze

  • Abteilungstrident
  • Buchstabenmillionär
  • Beiträge: 1.167
    • Profil anzeigen
Re: Frage zum Hardware Render Mode (DirectX9.0c)
« Antwort #2 am: 29. November 2006, 22:56:12 »
hier wird er erstellt:

// Vertex Puffer ertellen
g_App.GetDevice()->CreateVertexBuffer( 8*g_iMaxCubes*sizeof(D3DVERTEX), D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX, D3DPOOL_MANAGED, &g_pCubeVB, NULL);


hier gefüllt (iPos gibt die Nummer des Objektes an, welches reingeschrieben wird)

void FillVertexBuffer(int iPos)
{
 VOID* pData;      
 D3DVERTEX aTempBuffer[8];
 for (int i=0; i<8; i++)
  aTempBuffer = g_aCubeVertices[i+8*iPos];


 g_pCubeVB->Lock(8*iPos*sizeof(D3DVERTEX),sizeof(pData),(void**)&pData,0);
 memcpy(pData,aTempBuffer,8*sizeof(D3DVERTEX));
 g_pCubeVB->Unlock();               
}   // ~FillVertexBuffer();



kokunze

  • Abteilungstrident
  • Buchstabenmillionär
  • Beiträge: 1.167
    • Profil anzeigen
Re: Frage zum Hardware Render Mode (DirectX9.0c)
« Antwort #3 am: 30. November 2006, 00:09:46 »
D A N K E


Genau nach sowas hab ich gesucht. Einer einfachen kleinen Änderung und schon gehts :)

Wenn du mir jetzt noch sagen kannst, warum mein Programm bei Alt+Tab abstürzt, dann gibts gar keine Probs mehr *ggg*

Da bringt er nämlich wenn man zu dem Device zurückkehren will immer "Reset fehlgeschlagen" Nachricht. Einziger Parameter für Reset ist aber die PresentParameters Struktur, welche ja stimmen müsste


Die Funktionen Dafür:

bool CApp::CheckDevice(void)
{
 switch(m_pD3DDevice->TestCooperativeLevel())      
 {
  case D3DERR_DEVICELOST: return false;
  case D3DERR_DEVICENOTRESET:
  {
   if(FAILED(m_pD3DDevice->Reset(&m_PresentParameters)))   
   {
    ERRORMSG("Reset() fehlgeschlagen!", "CheckDevice();");
    return false;
   }

   InitScene();

   return true;
  }
   
  default: return true;
  }   // ~switch(m_pD3DDevice->TestCooperativeLevel())
} // ~CApp::CheckDevice();

Mongrel

  • Trident Vollmitglied
  • Labermonster
  • Beiträge: 482
    • Profil anzeigen
Re: Frage zum Hardware Render Mode (DirectX9.0c)
« Antwort #4 am: 30. November 2006, 12:22:36 »
Warum genau Dein Device nicht resetted werden kann, weiß ich nicht, aber möglicherweise hilft Dir folgendes:

Ressourcen, die im "Default" Pool angelegt werden, landen alle im Speicher der Hardware (und sind darum so schön flott und sinnvoll), verschwinden aber im Nirwana, wenn das Device verloren geht.

Beim DEVICE_LOST event musst Du also alle entsprechenden Ressourcen wieder neu laden. Vielleicht geht deswegen der Rest schief.

kokunze

  • Abteilungstrident
  • Buchstabenmillionär
  • Beiträge: 1.167
    • Profil anzeigen
Re: Frage zum Hardware Render Mode (DirectX9.0c)
« Antwort #5 am: 30. November 2006, 16:56:07 »
Also der Vertexpuffer wird dann kurz darauf wieder gefüllt, wär ja auch net schlimm wenn da ne Sekunde lang erstmal der Bildschirm leer bleibt. Aber das er bereits das Reset nicht ausführt...


kokunze

  • Abteilungstrident
  • Buchstabenmillionär
  • Beiträge: 1.167
    • Profil anzeigen
Re: Frage zum Hardware Render Mode (DirectX9.0c)
« Antwort #6 am: 30. November 2006, 17:11:31 »
Habs jetz mal ausgelotet, er sagt "INVALIDCALL", also muss irgendwas mit der PresentParameters Struktur net stimmen :( nur was...


EDIT:
Es liegt mit ziemlicher Sicherheit NICHT an den Present Parameters. hab jetzt den Teil, der die Present Parameters füllt ausgelagert und nochmal seperat vor dem Reset aufrufen lassen. Aber der Fehler bleibt...

foglender Code ist dazu gehörend:

case D3DERR_DEVICENOTRESET:
{
 InitPresentParameters();

 if(FAILED(m_pD3DDevice->Reset(&m_PresentParameters)))   
 {
  ERRORMSG("Reset() fehlgeschlagen!", "CheckDevice();");
  return false;
 }

 InitScene();
 return true;
}
« Letzte Änderung: 30. November 2006, 17:34:51 von kokunze »

kokunze

  • Abteilungstrident
  • Buchstabenmillionär
  • Beiträge: 1.167
    • Profil anzeigen
Re: Frage zum Hardware Render Mode (DirectX9.0c)
« Antwort #7 am: 30. November 2006, 19:12:38 »
Ich glaub jetzt gehts...
An den PResent-Parameters lags net.
Musste den Vertex- und Indexbuffer sowie das Font Objekt erst löschen, dann den Reset machen, und die 3 Dinge dann wieder neu anlegen. Nu funzt es

 

Benutzer Online

581 Gäste, 0 Mitglieder
Powered by EzPortal