D3D - Skinned Mesh rendern und culling



  • Ich versuche mich gerade mit dem Rendern von skinned meshes, welche ich mit D3DXLoadMeshHierarchyFromX lade.
    Zum testen benutze ich tiny.x aus dem SDK.

    Allerdings sieht der bei mir noch nicht so schick aus, aber seht selbst.

    An was könnte das liegen? Ich sehe in meinem Code keinen Fehler und da das ganze zum umfangreich ist, will ich jetzt auch nicht einfach nen rießigen batzen Code hier hinposten.

    Nachdem Laden benutze ich die ID3DXSkinInfo::ConvertToIndexedBlendedMesh Funktion um den Mesh in einen skinned mesh umzuwandeln.
    Zum Rendern benutze ich die fixed function pipeline, und das sieht so aus:

    updateCombinedTransforms( *mRoot );
    
    LPD3DXBONECOMBINATION boneCombinations 
    	= static_cast< LPD3DXBONECOMBINATION >( 
    					mBoneCombinationTable->GetBufferPointer() );
    
    mRenderer->setRenderState( D3DRS_VERTEXBLEND, mMaxVertInfluence - 1 );
    mRenderer->setRenderState( D3DRS_INDEXEDVERTEXBLENDENABLE, TRUE );
    
    IDirect3DDevice9* device = mRenderer->getD3DDevice();
    
    for( uint32 i = 0; i < mMeshContainer->mMaterials.size(); ++i )
    {
    	for( uint32 infl = 0; infl < mMaxVertInfluence; ++infl )
    	{
    		uint32 matrixIndex = boneCombinations[ i ].BoneId[ infl ];
    
    		if( matrixIndex != std::numeric_limits< uint32 >::max() &&
    			( i == 0 || //kleine Optimierung, hier wird nur die neue Matrix gesetzt wenn sie auch wirklich anders ist
    				matrixIndex != boneCombinations[ i - 1 ].BoneId[ infl ] ) )
    		{
    			device->SetTransform( D3DTS_WORLDMATRIX( infl ),
    								mCombinedTransforms[ matrixIndex ] );
    
    			device->MultiplyTransform( D3DTS_WORLDMATRIX( infl ),
    									&mBoneOffsetTransforms[ matrixIndex ] );
    		}
    
    		uint32 attribId = boneCombinations[ i ].AttribId;
    
    		//Material/Textur werden nur gesetzt wenn sie sich geändert haben
    		if( i == 0 || ( attribId != boneCombinations[ i - 1 ].AttribId ) )
    		{
    			MeshMaterial& mat = mMeshContainer->mMaterials[ attribId ];
    			mRenderer->setMaterial( mat.mMaterial );
    			mRenderer->setTexture( 0, mat.mTexture );
    		}
    
    		mSkinnedMesh->DrawSubset( i );
    	}
    }
    
    mRenderer->setRenderState( D3DRS_INDEXEDVERTEXBLENDENABLE, FALSE );
    mRenderer->setRenderState( D3DRS_VERTEXBLEND, D3DVBF_DISABLE );
    

    Außerdem ist der zbuffer eingeschaltet und lighting ausgeschaltet.

    Edit:

    Mir ist eben beim Zähneputzen eingefallen wo mein Fehler liegt:
    Ich hab zum zeichnen die Routine aus einem Beispiel für non-indexed vertex blending benutzt.
    Kann dann zu.

    Edit2:

    Jetzt sieht es(?) richtig aus, allerdings hatte ich Darstellungsfehler, wenn ich den cull mode auf cull none stelle. Ich dachte immer culling wäre nur für bessere Performance gut?

    ohne culling
    counter clockwise culling


  • Mod

    schaut irgendwie eher aus wie mit udn ohne z-buffer.



  • Habe es eben nochmals versucht, wenn ich den Z-Buffer direkt in dem Zeichenaufruf auf true setze und auch direkt über das IDirect3DDevice9-Interface.
    Das Ergebnis ist das selbe.

    Die device settings bei dem Versuch:

    Device settings:
    Adapter: Intel(R) 82852/82855 GM/GME Graphics Controller
    Device type: hal
    Adapter format: X8R8G8B8
    Behaviour: software vertex-processing
    Resolution: 640x480
    Backbuffer count: 1
    Multisample with: 0samples
    Multisample Quality: 0
    Swap effect: discard
    Window mode: windowed
    DepthStencil buffer: 16bit depth
    Flags: discard depth-stencil buffer, lockable backbuffer
    Refresh rate (fullscreen only): 0Hz

    Wobei ich bei den Bildern oben den referenz rasterizer drin hatte (ohne multisampling sieht es nicht so schön aus, ändert aber an dem Fehler nichts).

    Edit:

    Die Darstellungsfehler liegen an dem Mesh und nicht meinem Code zum zeichnen.
    Bei einem Beispielprogramm sieht der Mesh ebenfalls fehlerhaft aus, je nach Blickwinkel.


Anmelden zum Antworten