Pixelformate filtern



  • Hallo,

    ich schreibe grade an einer Grafikkartenenumeration und ich frage mich, wie ich die Pixelformate herausfiltern kann. Ich habe mit der methode enumAdapters die möglichen Adapter enumeriert, und auch schon alle devicetypen (hal, rel und sw) herausgefiltert. Nun muss ich die Pixelformate enumerieren. Ich habe da eine methode CheckDeviceFormat gefunden, aber die erwartet 2 mal einen buffer für die struktur, wo mein pixelformat drin steht. Ausserdem habe ich die Parameter um den Usage noch nicht verstanden. Vielleicht kann mir da einer hilfen, natürlich ist das ganze in Direct3D.

    Gruß Para



  • musst beide male dasselbe eintragen, die beiden werte sind für front/backbuffer, und da man da eh sogut wie nie unterschiedliche werte hat(ich weis garnicht, wie man das am ende überhaupt einstellt), kann man das getrost links liegen lassen.

    der parameter usage steht dafür, worauf du rendern willst,wenn du den zstencil buffer testest, musste das auf D3DUSAGE_DEPTHSTENCIL setzen, für das ganz normale grafik format auf D3DUSAGE_RENDERTARGET. aufjedenfall musst du im laufe der enumeration beides testen

    beim testen des depthstencil buffers musst du aber bei den 2. parameter wo dud as pixelformat einstellen musst, statt des pixelformats, das depthstencil format eintragen.



  • naja also es geht mir erstmal nur um das Pixelformat.

    Sagen wir mal ich habe eine funktion der form wie unten wie muss ich dann die methode aufrufen?!

    unsigned int GetPossibleAdapterFormats (D3DDEVTYPE devtype, unsigned int adapter)
    {
       //TODO: Pixelformate enumieren (für alle Grafikadapter)
    }
    

    Gruß Para



  • meint ihr das folgende könnte dem zweck genüge tun:

    void MACD3DEnum::GetAdapterFormat (D3DDEVTYPE devtype, unsigned int adapter)
    {
    	std::vector<MACDEVICE*>::const_iterator device;
    	D3DFORMAT tmp [] = 
    	{
    		{D3DFMT_R8G8B8},
    		{D3DFMT_A8R8G8B8},
    		{D3DFMT_X8R8G8B8},
    		{D3DFMT_R5G6B5},
    		{D3DFMT_X1R5G5B5},
    		{D3DFMT_A1R5G5B5},
    		{D3DFMT_A4R4G4B4},
    		{D3DFMT_A8R3G3B2},
    		{D3DFMT_X4R4G4B4},
    		{D3DFMT_A2B10G10R10},
    		{D3DFMT_A8B8G8R8},
    		{D3DFMT_X8B8G8R8},
    		{D3DFMT_G16R16},
    		{D3DFMT_A2R10G10B10},
    		{D3DFMT_A16B16G16R16},
    	};
    
    	device = m_adapter[adapter].deviceinfo.begin ();
    
    	for (int loop=0; loop<sizeof (tmp)/sizeof (tmp[0]); loop++)
    	{
    
    		if (m_ptr_d3d->CheckDeviceFormat (adapter, 
    										  devtype, 
    										  tmp[loop], 
    										  D3DUSAGE_RENDERTARGET, 
    										  D3DRTYPE_SURFACE, 
    										  tmp[loop]) == D3D_OK)
    		{
    			//eintragen der formate in den vektor
    		}
    
    	}
    
    }
    


  • Also ich finde so 'ne Methode wie in OSR gut. Die möglichen Formate rausfinden ist ja kein Problem, aber später soll es der User ja auch möglichst einfach einstellen können, ohne die Bedeutung von X8R8G8B8 zu kennen.

    Bye, TGGC \-/



  • wer ist denn OSR ??



  • {D3DFMT_R8G8B8},
    {D3DFMT_A8R8G8B8},
    {D3DFMT_X8R8G8B8},
    {D3DFMT_R5G6B5},
    {D3DFMT_X1R5G5B5},
    {D3DFMT_A1R5G5B5},
    {D3DFMT_A4R4G4B4},
    {D3DFMT_A8R3G3B2},
    {D3DFMT_X4R4G4B4},
    {D3DFMT_A2B10G10R10},
    {D3DFMT_A8B8G8R8},
    {D3DFMT_X8B8G8R8},
    {D3DFMT_G16R16},
    {D3DFMT_A2R10G10B10},
    {D3DFMT_A16B16G16R16},

    nicht einmal die hälfte der formate ist für front UND backbuffer gültig.
    siehe directx hilfe



  • naja das ist ja nicht das problem wenn da welche dabei sind die unterstützt werden.



  • aber wieso willste was überprüfen, von dem du im vornherein sagen kannst, dass es nie zutreffen wird?



  • Hmmm mal was anderes ich habe ein paar Schwierigkeiten mit Begriffen. Kann mir einer mal den Unterschied zwischen den folgenden Begriffen erklären:

    => Backbuffer
    => Frontbuffer
    => Stencilbuffer
    => Z- Buffer
    => Vertexbuffer
    => Vertex processing



  • backbuffer-darauf wird während des rendervorgangs gerendert
    frontbuffer-format wie die daten an den bildschirm gesendet werden
    z buffer-speichert die z koordinaten eines pixels, wird verwendet damit immer der vorderste pixel vorne ist.
    Stencilbuffer-wird für echtzeitschatten berechnung(und anderes) benötigt.
    zbuffer und stencilbuffer sind eigentlich ein einziger buffer.
    vertexbuffer-da werden die einzelnen punkte der modelle gespeichert
    vertex processing-weis net genau, ist wahrscheinlich die punktberechnung von der 3d karte aus


Anmelden zum Antworten