Thread: DX9 visualization problem

  1. #1
    Registered User
    Join Date
    Jun 2002
    Posts
    35

    DX9 visualization problem

    If you press LEFT ARROW or RIGHT ARROW you'll see the left face of the cube even if the front face is in front of of hte left face

    I think it is a CULL_MODE problem, but I'm not sure, can you help me?

    I don't want a trasparent front face, I want it solid

    Thank you for your help

    Code:
    #include <Windows.h>
    #include <mmsystem.h>
    #include <d3dx9.h>
    
    #define WIN32_LEAN_AND_MEAN		// Exclude rarely-used stuff from Windows headers
    // Our custom FVF, which describes our custom vertex structure
    #define D3DFVF_VERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE)
    #define HEIGHT 480
    #define WIDTH 640
    #define SPEED 0.1f
    #define NVERTEX 12
    
    // A structure for our custom vertex type
    struct VERTEX
    {
        FLOAT x, y, z;      // The untransformed, 3D position for the vertex
        DWORD color;        // The vertex color
    };
    
    void InitVertex (VERTEX *, float, float, float, DWORD);
    void SetupViewMat ();
    void SetupViewMat ();
    void SetupProjMat ();
    
    LPDIRECT3D9 pD3D = NULL; // Used to create the D3DDevice
    LPDIRECT3DDEVICE9 pd3dDevice = NULL; // Our rendering device
    LPDIRECT3DVERTEXBUFFER9 pVB = NULL; // Buffer to hold vertices
    float EyeX = 0, EyeY = 0, EyeZ = -3;
    float LookAtX = 0, LookAtY = 0, LookAtZ = 51;
    
    void InitD3D (HWND hWnd)
    {
        // Create the D3D object.
        pD3D = Direct3DCreate9 (D3D_SDK_VERSION);
    
        // Set up the structure used to create the D3DDevice
        D3DPRESENT_PARAMETERS d3dpp;
        ZeroMemory (&d3dpp, sizeof (d3dpp));
        d3dpp.Windowed = TRUE;
        d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
        d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
    
        // Create the D3DDevice
        pD3D -> CreateDevice (D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                          D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                          &d3dpp, &pd3dDevice);
    
        // Turn off culling, so we see the front and back of the triangle
        pd3dDevice -> SetRenderState (D3DRS_CULLMODE, D3DCULL_NONE);
    
        // Turn off D3D lighting, since we are providing our own vertex colors
        pd3dDevice -> SetRenderState (D3DRS_LIGHTING, FALSE);
    }
    
    void SetupWorldMat ()
    {
        // For our world matrix, we will just rotate the object about the y-axis.
        D3DXMATRIX matWorld;
    
        // Set up the rotation matrix to generate 1 full rotation (2*PI radians) 
        // every 1000 ms. To avoid the loss of precision inherent in very high 
        // floating point numbers, the system time is modulated by the rotation 
        // period before conversion to a radian angle.
    	D3DXMatrixIdentity (&matWorld);
        pd3dDevice -> SetTransform (D3DTS_WORLD, &matWorld);
    }
    
    void SetupViewMat ()
    {
    	// Set up our view matrix. A view matrix can be defined given an eye point,
        // a point to lookat, and a direction for which way is up. Here, we set the
        // eye five units back along the z-axis and up three units, look at the
        // origin, and define "up" to be in the y-direction.
        D3DXVECTOR3 vEyePt (EyeX, EyeY, EyeZ);
        D3DXVECTOR3 vLookatPt (LookAtX, LookAtY, LookAtZ);
        D3DXVECTOR3 vUpVec (0, 1, 0);
        D3DXMATRIXA16 matView;
        D3DXMatrixLookAtLH (&matView, &vEyePt, &vLookatPt, &vUpVec);
        pd3dDevice -> SetTransform (D3DTS_VIEW, &matView);
    }
    
    void SetupProjMat ()
    {
    	// For the projection matrix, we set up a perspective transform (which
        // transforms geometry from 3D view space to 2D viewport space, with
        // a perspective divide making objects smaller in the distance). To build
        // a perpsective transform, we need the field of view (1/4 pi is common),
        // the aspect ratio, and the near and far clipping planes (which define at
        // what distances geometry should be no longer be rendered).
        D3DXMATRIX matProj;
    
        D3DXMatrixPerspectiveFovLH (&matProj, D3DX_PI/4, (float)WIDTH / (float)HEIGHT, 1, 50);
        pd3dDevice -> SetTransform (D3DTS_PROJECTION, &matProj);
    }
    
    HRESULT InitScene ()
    {
        // Initialize three vertices for rendering a triangle
        VERTEX Cube[NVERTEX];
    	int i = -1;
    
    	ZeroMemory (Cube, sizeof (Cube));
    
    	// faccia frontale
    	InitVertex (&Cube[++i], -1,  1, 3, RGB (255,   0,   0));	// 1 rosso
    	InitVertex (&Cube[++i], -1, -1, 3, RGB (  0, 255, 255));	// 2 giallo
    	InitVertex (&Cube[++i],  1, -1, 3, RGB (  0,   0, 255));	// 3 blu
    
    	InitVertex (&Cube[++i], -1,  1, 3, RGB (255,   0,   0));	// 1 rosso
    	InitVertex (&Cube[++i],  1, -1, 3, RGB (  0,   0, 255));	// 3 blu
    	InitVertex (&Cube[++i],  1,  1, 3, RGB (  0,   255, 0));	// 4 verde
    
    	// faccia sinistra
    	InitVertex (&Cube[++i], -1,  1, 3, RGB (255,   0,   0));	// 1 rosso
    	InitVertex (&Cube[++i], -1, -1, 3, RGB (  0, 255, 255));	// 2 giallo
    	InitVertex (&Cube[++i], -1,  1, 4, RGB (255,   0,   0));	// 7 blu
    	
    	InitVertex (&Cube[++i], -1, -1, 3, RGB (  0, 255, 255));	// 2 giallo
    	InitVertex (&Cube[++i], -1,  1, 4, RGB (255,   0,   0));	// 7 blu
    	InitVertex (&Cube[++i], -1, -1, 4, RGB (  0, 255,   0));	// 8 verde
    
        // Create the vertex buffer.
        if ((pd3dDevice -> CreateVertexBuffer (NVERTEX * sizeof (VERTEX),
                                                      0, D3DFVF_VERTEX,
                                                      D3DPOOL_DEFAULT, &pVB, NULL)) < 0)
            return FALSE;
    
        // Fill the vertex buffer.
        VOID *pVertices;
        if ((pVB -> Lock (0, sizeof (Cube), (void **)&pVertices, 0)) < 0)
            return FALSE;
    
        memcpy (pVertices, Cube, sizeof (Cube));
        pVB -> Unlock ();
    
        return TRUE;
    }
    
    void InitVertex (VERTEX *vertex, float x, float y, float z, DWORD color)
    {
    	vertex -> x = x;
    	vertex -> y = y;
    	vertex -> z = z;
    	vertex -> color = color;
    }
    
    VOID DrawScene ()
    {
        // Clear the backbuffer to a black color
        pd3dDevice -> Clear (0, NULL, D3DCLEAR_TARGET, RGB (0,0,0), 1, 0);
    
        // Begin the scene
        pd3dDevice -> BeginScene ();
        
    		// Render the vertex buffer contents
            pd3dDevice -> SetStreamSource (0, pVB, 0, sizeof (VERTEX));
            pd3dDevice -> SetFVF (D3DFVF_VERTEX);
            pd3dDevice -> DrawPrimitive (D3DPT_TRIANGLELIST, 0, NVERTEX / 3);
    
            // End the scene
        pd3dDevice->EndScene ();
    
        // Present the backbuffer contents to the display
        pd3dDevice -> Present (NULL, NULL, NULL, NULL);
    }
    
    VOID D3DFree ()
    {
        if (pVB != NULL)
            pVB -> Release ();
    
        if (pd3dDevice != NULL)
            pd3dDevice -> Release ();
    
        if (pD3D != NULL)
            pD3D -> Release ();
    }
    
    LRESULT WINAPI MsgProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        switch (msg)
        {
            case WM_DESTROY:
                D3DFree ();
                PostQuitMessage (0);
            return 0;
    
    		case WM_KEYDOWN:  // A key has been pressed, end the app
    			switch(wParam)
    			{
    				case VK_UP:
    					EyeZ = EyeZ + SPEED;
    					LookAtZ = LookAtZ + SPEED;
    					SetupViewMat ();
    				break;
                
    				case VK_DOWN:
    					EyeZ = EyeZ - SPEED;
    					LookAtZ = LookAtZ - SPEED;
    					SetupViewMat ();
    				break;
    				
    				case VK_LEFT:
    					EyeX = EyeX + SPEED;
    					LookAtX = LookAtX + SPEED;
    					SetupViewMat ();					
    				break;
    				
    				case VK_RIGHT:
    					EyeX = EyeX - SPEED;
    					LookAtX = LookAtX - SPEED;
    					SetupViewMat ();
    				break;
    
    				case 'W':
    					EyeY = EyeY - SPEED;
    					LookAtY = LookAtY - SPEED;
    					SetupViewMat ();
    				break;
    
    				case 'S':
    					EyeY = EyeY + SPEED;
    					LookAtY = LookAtY + SPEED;
    					SetupViewMat ();
    				break;
    			}
    		break;
    	}
    
        return DefWindowProc (hWnd, msg, wParam, lParam);
    }
    
    INT WINAPI WinMain (HINSTANCE hInst, HINSTANCE, LPSTR, INT)
    {
        // Register the window class
        WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
                          GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                          "D3D Tutorial", NULL };
        RegisterClassEx (&wc);
    
        // Create the application's window
        HWND hWnd = CreateWindow ("D3D Tutorial", "D3D Tutorial 03: Matrices",
                                  WS_OVERLAPPEDWINDOW, 100, 100, WIDTH, HEIGHT,
                                  GetDesktopWindow(), NULL, wc.hInstance, NULL);
    
        // Initialize Direct3D
        InitD3D (hWnd);
    	
    	SetupWorldMat ();
    	SetupViewMat ();
    	SetupProjMat ();
    
        InitScene ();
    
    	// Show the window
        ShowWindow (hWnd, SW_SHOWDEFAULT);
        UpdateWindow (hWnd);
    
        // Enter the message loop
        MSG msg;
        ZeroMemory (&msg, sizeof (msg));
        while (msg.message != WM_QUIT)
        {
    		if (PeekMessage (&msg, NULL, 0U, 0U, PM_REMOVE))
    		{
    			TranslateMessage (&msg);
    			DispatchMessage (&msg);
    		}
    		else
    			DrawScene ();
    	}
        
        UnregisterClass ("D3D Tutorial", wc.hInstance);
        return 0;
    }

  2. #2
    Registered User
    Join Date
    Apr 2002
    Posts
    1,571
    Try using clockwise culling.

    change:
    Code:
    pd3dDevice -> SetRenderState (D3DRS_CULLMODE, D3DCULL_NONE);
    to:
    Code:
    pd3dDevice -> SetRenderState (D3DRS_CULLMODE, D3DCULL_CW);

  3. #3
    Registered User
    Join Date
    Jun 2002
    Posts
    35
    If I do that, the front face disappear

  4. #4
    Registered User
    Join Date
    Apr 2002
    Posts
    1,571
    So, did you try CCW for counter-clockwise?

    If this isn't what you are talking about, you may need a depth-buffer. I'd have to look at it to make any further assessments.

  5. #5
    Registered User
    Join Date
    Jun 2002
    Posts
    35
    I don't know very vell how, but I did it

    Anyway, Thank you very much for your help

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Memory problem with Borland C 3.1
    By AZ1699 in forum C Programming
    Replies: 16
    Last Post: 11-16-2007, 11:22 AM
  2. Someone having same problem with Code Block?
    By ofayto in forum C++ Programming
    Replies: 1
    Last Post: 07-12-2007, 08:38 AM
  3. A question related to strcmp
    By meili100 in forum C++ Programming
    Replies: 6
    Last Post: 07-07-2007, 02:51 PM
  4. WS_POPUP, continuation of old problem
    By blurrymadness in forum Windows Programming
    Replies: 1
    Last Post: 04-20-2007, 06:54 PM
  5. Laptop Problem
    By Boomba in forum Tech Board
    Replies: 1
    Last Post: 03-07-2006, 06:24 PM