Seite 1 von 1

DirectX SetTransform keinen Effekt

Verfasst: 22.11.2010, 09:13
von Hellhound
Hallo zusammen,

ich versuche mich grad in der Umsetzung einer Camera für DirectX. Irgendwie scheint bei mir DirectX sämtliche meiner SetTransform Befehle zu ignorieren, ich bekomme irgendwie mein Dreieck nicht in den Sichtbereich:

Hier definiere ich die Matrizen für die View:

Code: Alles auswählen

D3DXMATRIX view_matrix;
D3DXMATRIX projection_matrix;
D3DXVECTOR3 eye_vector;
D3DXVECTOR3 lookat_vector;
D3DXVECTOR3 up_vector;
D3DXMATRIX world_matrix;
float aspect;

   //Here we build our View Matrix, think of it as our camera.

   //First we specify that our viewpoint is 5 units back on the Z-axis
   eye_vector=D3DXVECTOR3( 0.0f, 0.0f, -5.0f );

   //We are looking towards the origin
   lookat_vector=D3DXVECTOR3( 0.0f, 0.0f, 0.0f );

   //The "up" direction is the positive direction on the y-axis
   up_vector=D3DXVECTOR3(0.0f,1.0f,0.0f);

   D3DXMatrixLookAtLH(&view_matrix,&eye_vector,
                                   &lookat_vector,
                                   &up_vector);

   //Since our 'camera' will never move, we can set this once at the
   //beginning and never worry about it again
   d3ddev->SetTransform(D3DTS_VIEW,&view_matrix);

   aspect=((float)RES_WIDTH / (float)RES_HEIGHT);

   D3DXMatrixPerspectiveFovLH(&projection_matrix, //Result Matrix
                              D3DX_PI/4,          //Field of View, in radians.
                              aspect,             //Aspect ratio
                              1.0f,               //Near view plane
                              100.0f );           //Far view plane

   //Our Projection matrix won't change either, so we set it now and never touch
   //it again.
   d3ddev->SetTransform(D3DTS_PROJECTION, &projection_matrix);


   //The World Matrix transforms Model Coordinates into World Space coordinates.
   //Setting it to Identity means there is no transformation, so Model Space is directly
   //mapped onto World Space.
   D3DXMatrixIdentity(&world_matrix);
   d3ddev->SetTransform(D3DTS_WORLD,&world_matrix);
Eigentlich nichts wildes, mein simples Dreieck, das ich im Ursprung definiert habe, wird dennoch nicht
gerendert:

Code: Alles auswählen

 // create the vertices using the Vertex struct
    Vertex vertices[] = {
       Vertex(- 10.0f,  0.0f, 0.0f, brMath::brVector3f(1.0f,0.0f,0.0f)),
       Vertex(  10.0f,  0.0f, 0.0f, brMath::brVector3f(0.0f,1.0f,0.0f)),
       Vertex(  0.0f,  10.0f, 0.0f, brMath::brVector3f(0.0f,0.0f,1.0f)),
    };

    D3DVERTEXELEMENT9 elements[] = {
       {0, 0,  D3DDECLTYPE_FLOAT3,   D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION,  0},
       {0, 12, D3DDECLTYPE_FLOAT3,   D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR,     0},
       D3DDECL_END()
    };
Habe mir schon dutzende Tutorials angeschaut und auch lauffähig bekommen, die arbeiten alle jedoch mit einer
D3DFVF Geometriedefition, ich hingegen mit einer Element discription. Hier benutze ich extra untransformierte
Vertexdaten...

Habe ich irgend etwas übersehen, dass ich zusätzlich berücksichtigen muß?

Re: DirectX SetTransform keinen Effekt

Verfasst: 22.11.2010, 10:33
von TGGC
Ich glaube nicht, das SetTransform ignoriert wird. Der Fehler ist sicher wo anders.

Re: DirectX SetTransform keinen Effekt

Verfasst: 22.11.2010, 10:44
von anonym
D3DRS_CULLMODE Specifies how back-facing triangles are culled, if at all. This can be set to one member of the D3DCULL enumerated type. The default value is D3DCULL_CCW.

Re: DirectX SetTransform keinen Effekt

Verfasst: 22.11.2010, 10:50
von Hellhound
Hmm, ich wüsste nicht wo, ohne Matrix mit bereits vortransformierten Vertices bekomme ich ohne Weiteres
mein Dreieck gerendert... Hmm, hier mal zur Vervollständigung der gesamte Code:

Code: Alles auswählen

// Create our custom vertex format
class Vertex
{
public:
   Vertex(float x, float y, float z, brMath::brVector3f col)
   :pos(x,y,z), color(col){}

private:
   brMath::brVector3f pos;
   brMath::brVector3f color;
};

Code: Alles auswählen

int main()
{
  try{
    // initialize default logger and log to file and console
    using namespace brCore;
    brLog::brLogger& log = brCore::brLog::getInstance();
    log << output(brLog::OUT_CON_LOG) << time << "BinRev first simple D3D9 demo v1.0" << std::endl;

    // create D3D9Device for D3D initialization 
    boost::shared_ptr<brRenderer::brD3D9Device> device = 
    boost::shared_ptr<brRenderer::brD3D9Device>(new brRenderer::brD3D9Device()); 

    // create rendering window
    boost::shared_ptr<brRenderer::brD3DWindow> window = 
    boost::shared_ptr<brRenderer::brD3DWindow>(new brRenderer::brD3DWindow(device));
    window->createWindow("Simple D3D9 demo", RES_WIDTH, RES_HEIGHT, false, brGraphics::brWindowSettings());
   
    // Get the D3DDevice adaptee to access D3D commands
    LPDIRECT3DDEVICE9 d3ddev = device->getDevice();
       
    // create the vertices using the Vertex struct
    Vertex vertices[] = {
       Vertex(- 10.0f,  0.0f, 0.0f, brMath::brVector3f(1.0f,0.0f,0.0f)),
       Vertex(  10.0f,  0.0f, 0.0f, brMath::brVector3f(0.0f,1.0f,0.0f)),
       Vertex(  0.0f,  10.0f, 0.0f, brMath::brVector3f(0.0f,0.0f,1.0f)),
    };

    D3DVERTEXELEMENT9 elements[] = {
       {0, 0,  D3DDECLTYPE_FLOAT3,   D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION,  0},
       {0, 12, D3DDECLTYPE_FLOAT3,   D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR,     0},
       D3DDECL_END()
    };

    // Use the vertex element array to create a vertex declaration.
    IDirect3DVertexDeclaration9* myVertexDecl = 0;
    HRESULT hr = d3ddev->CreateVertexDeclaration(elements, &myVertexDecl);

    if (FAILED(hr))
    {
 	      throw brCore::brIllegalStateException(
          "Couldn't create valid D3D9VertexDeclaration!");
    }    
    
    // initialize the vertexBuffer and bind data
    brRenderer::brD3D9VertexBuffer buffer = brRenderer::brD3D9VertexBuffer(device, 3, sizeof(Vertex));
    buffer.setVertexData(0, sizeof(vertices), vertices);

    // get the D3D buffer interface
    IDirect3DVertexBuffer9* d3dBuffer = buffer.getVertexBuffer();

    // init view matrices
    initMatrices(d3ddev);
 
    // Define application loop. Use this loop to perform 
    // your D3D rendering.
    while(isAlive)
    {   
        // process window events
        window->handleEvents();

	// clear the window to a deep blue
        d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0);
        d3ddev->BeginScene();    // begins the 3D scene

        // do 3D rendering on the back buffer here
	// select which vertex format we are using
        d3ddev->SetVertexDeclaration(myVertexDecl);
	d3ddev->SetStreamSource(0, d3dBuffer, 0, sizeof(Vertex));
	d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);

         d3ddev->EndScene();    // ends the 3D scene
        d3ddev->Present(0,0,0,0);   // displays the created frame on the screen
     
        // Finally, display the rendered frame on screen
        window->display();     
    }
  }
  // handle possible exceptions using the brExeptionHandler mechanism.
  catch(brCore::brException& e){
       brCore::brExceptionHandler::getInstance().handleException(e);
       return APPLICATION_EXIT_ABNORMAL;
  }
  // fallback for any std::exception type.
  catch(std::exception& e){
       brCore::brExceptionHandler::getInstance().handleException(e);
       return APPLICATION_EXIT_ABNORMAL;
  }
  // fallback for unknown exeption types.
  catch(...){
       printf("Unknown exception caught!");
       return APPLICATION_EXIT_ABNORMAL;
  }
 
  // return successfully
  return APPLICATION_EXIT_SUCCESFULLY;
}
Kann mir nicht vorstellen, dass der Fehler irgendwo in der Device Defintition liegt, falls es doch dort möglicherweise
Probleme geben sollte, kann ich den Code gern auch noch mal Posten. Ansonsten kann er auch hier der im oberen Snipptet
genutzte abhängige Code komplett eingesehen werden:

http://binrevengine.svn.sourceforge.net ... r/DirectX/

Re: DirectX SetTransform keinen Effekt

Verfasst: 22.11.2010, 11:03
von Schrompf
Culling könnte dafür verantwortlich sein, dass Du nichts siehst - schalte das mal ab, wie anonym geschrieben hat. Außerdem könnte es sein, dass jemand Deine Matrizen überschreibt, nachdem Du sie gesetzt hast. Ich weiß nicht, was in dem sonstigen "Engine"-Code so abgeht, aber das könntest Du ausschließen, indem Du einfach mal in jedem Frame die Matrizen neu setzt.

Letzte Idee: stelle sicher, dass der ZTest Dir nicht dazwischenfunkt und das kein AlphaTest oder AlphaBlending aktiv ist. Das Lighting müsste passen, denke ich - Du leerst ja den Bildschirm mit einer sinnvollen Farbe, und unbeleuchtete Dreiecke würden schwarz darauf sichtbar sein.

Re: DirectX SetTransform keinen Effekt

Verfasst: 22.11.2010, 11:22
von anonym
Deine Vertices sind im Beispiel jedenfalls gegen den Uhrzeigersinn angegeben. Konsultiere einfach mal PIX (im DX-SDK), das gibt unter anderem über die Korrektheit der Transformation in den Viewport Auskunft. Vielleicht kannst Du auch das PIX-Run oder -Experiment-File hochladen, wenn Du nicht weiterkommst.

Re: DirectX SetTransform keinen Effekt [solved]

Verfasst: 22.11.2010, 11:51
von Hellhound
Bingo es war das Culling, muß mich erstmal an das LH Koordinatensystem und die etwas
andere Denke als in OpenGL gewöhnen ... Danke Leute, da hätte ich lange, sehr lange
gesucht ...