DirectX SetTransform keinen Effekt

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
Hellhound
Beiträge: 53
Registriert: 23.08.2010, 10:00
Wohnort: Braunschweig
Kontaktdaten:

DirectX SetTransform keinen Effekt

Beitrag 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ß?
Benutzeravatar
TGGC
Establishment
Beiträge: 569
Registriert: 15.05.2009, 18:14
Benutzertext: Ich _bin_ es.
Alter Benutzername: TGGC
Echter Name: Ich _bin_ es.
Wohnort: Mainz
Kontaktdaten:

Re: DirectX SetTransform keinen Effekt

Beitrag von TGGC »

Ich glaube nicht, das SetTransform ignoriert wird. Der Fehler ist sicher wo anders.
anonym
Beiträge: 79
Registriert: 15.07.2009, 07:35
Kontaktdaten:

Re: DirectX SetTransform keinen Effekt

Beitrag 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.
Benutzeravatar
Hellhound
Beiträge: 53
Registriert: 23.08.2010, 10:00
Wohnort: Braunschweig
Kontaktdaten:

Re: DirectX SetTransform keinen Effekt

Beitrag 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/
Benutzeravatar
Schrompf
Moderator
Beiträge: 5047
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: DirectX SetTransform keinen Effekt

Beitrag 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.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
anonym
Beiträge: 79
Registriert: 15.07.2009, 07:35
Kontaktdaten:

Re: DirectX SetTransform keinen Effekt

Beitrag 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.
Benutzeravatar
Hellhound
Beiträge: 53
Registriert: 23.08.2010, 10:00
Wohnort: Braunschweig
Kontaktdaten:

Re: DirectX SetTransform keinen Effekt [solved]

Beitrag 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 ...
Antworten