Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: x-alien en 05 de Enero de 2003, 05:53:11 AM

Título: PROBLEMA CON D3D9, HELP NEEDED
Publicado por: x-alien en 05 de Enero de 2003, 05:53:11 AM
                                hola, me ha surgido un error al k no le encuentro solucion...

cuando genero el programa, no me da error (con nivel de advertencia w 4), pero cuando se ejecuta lo veo todo negro, si activo una rejilla no se ve na.. si activo la camara =, os pego mi codigo fuente capado, al cual le he kitado frustum cullig, carga de modelos x y luces.
lo he dejado solo con un triangulo, una camara, y una cuadricula(grid).

aunke cargara modelos no se veian...=( ni las luces ni na...
lo he debuggeado mil veces y no encuentro error.... :(  :(  :(
alguien con mas experiencia k yo me podria decir pork no veo el triangulo y el grid??

cpp



#define WIN32_LEAN_AND_MEAN

#define APP_NAME "XEON"

#define WND_WIDTH 640

#define WND_HEIGHT 480

#include <windows.h>

#include <mmsystem.h>

#include <d3d9.h>

#include <d3dx9.h>

#include "resource.h"

#include "d3dxeon.h"

XeonEngine Xeon;

LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );





//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------

XeonEngine::XeonEngine()

{

m_pD3D       = NULL;

m_pd3dDevice = NULL;

m_pVB        = NULL;

}

//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------

HRESULT XeonEngine::CreateD3D(HWND hWnd)

{

if( NULL == ( m_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )

       return E_FAIL;



D3DPRESENT_PARAMETERS d3dpp;

   ZeroMemory( &d3dpp, sizeof(d3dpp) );

   d3dpp.BackBufferCount = 1;

d3dpp.BackBufferWidth = WND_WIDTH;

d3dpp.BackBufferHeight = WND_HEIGHT;

d3dpp.Windowed = TRUE;

   d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;

   d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

d3dpp.EnableAutoDepthStencil = TRUE;

d3dpp.AutoDepthStencilFormat = D3DFMT_D16;

   if( FAILED( m_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,

                                     D3DCREATE_SOFTWARE_VERTEXPROCESSING,

                                     &d3dpp, &m_pd3dDevice ) ) )

   {

       return E_FAIL;

   }

m_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE);

   m_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );

m_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );

   return S_OK;

}

//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------

void XeonEngine::Delete()

{

if(m_pVB != NULL)

 m_pVB->Release();

if(m_pd3dDevice != NULL)

       m_pd3dDevice->Release();

if(m_pD3D != NULL)

 m_pD3D->Release();

}

//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------

VOID XeonEngine::SetupMatrices()

{

   

   D3DXMATRIXA16 matWorld;

   UINT  iTime  = timeGetTime() % 1000;

   FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 1000.0f;

   D3DXMatrixRotationY( &matWorld, fAngle );

   m_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );



   D3DXVECTOR3 vEyePt( 0.0f, 3.0f,-5.0f );

   D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );

   D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );

   D3DXMATRIXA16 matView;

   D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );

   m_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );





   D3DXMATRIXA16 matProj;

   D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, (float)(WND_WIDTH/WND_HEIGHT), 1.0f, 100.0f );

   m_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );

}

//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------

HRESULT XeonEngine::Vertices()

{

   CUSTOMVERTEX g_Vertices[] =

   {

       { -1.0f,-1.0f, 0.0f, D3DCOLOR_XRGB(255,   0,   0), },

       {  1.0f,-1.0f, 0.0f, D3DCOLOR_XRGB(0,   255,   0), },

       {  0.0f, 1.0f, 0.0f, D3DCOLOR_XRGB(0,   0,   255), },

   };

   if( FAILED( m_pd3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX),

                                                 0, D3DFVF_CUSTOMVERTEX,

                                                 D3DPOOL_DEFAULT, &m_pVB, NULL ) ) )

   {

       return E_FAIL;

   }

   VOID* pVertices;

   if( FAILED( m_pVB->Lock( 0, sizeof(g_Vertices), (void**)&pVertices, 0 ) ) )

       return E_FAIL;

   memcpy( pVertices, g_Vertices, sizeof(g_Vertices) );

   m_pVB->Unlock();



   return S_OK;

}



//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------

HRESULT XeonEngine::GridInit()

{



int i = 0;





for(i = 0; i < 5; i++)

malla[i].color = D3DCOLOR_XRGB(255,   255,   255);





malla[0].pos = D3DXVECTOR3(-5.0f, 0.0f,  5.0f);

malla[0].pos = D3DXVECTOR3( 5.0f, 0.0f,  5.0f);

malla[0].pos = D3DXVECTOR3( 5.0f, 0.0f, -5.0f);

malla[0].pos = D3DXVECTOR3(-5.0f, 0.0f, -5.0f);



return S_OK;

}

void XeonEngine::RenderGrid()

{



D3DXMATRIX world;





m_pd3dDevice->SetTexture(0, NULL);



   m_pd3dDevice->SetFVF( D3DFVF_GRID );



for(int z = -100; z <= 100; z += 10)

{

 for(int x = -100; x <= 100; x += 10)

 {

  D3DXMatrixTranslation(&world, (float)x, 0.0f, (float)z);

  m_pd3dDevice->SetTransform(D3DTS_WORLD, &world);

  m_pd3dDevice->DrawPrimitiveUP(D3DPT_LINESTRIP, 8, malla, sizeof(GRID));

 }

}

}

//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------



//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------

void XeonEngine::Render()

{

if(NULL == m_pd3dDevice)

 return;

m_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0 );



if( SUCCEEDED( m_pd3dDevice->BeginScene() ) )

   {

 //SetupMatrices();

 RenderGrid();

       m_pd3dDevice->SetStreamSource( 0, m_pVB, 0, sizeof(CUSTOMVERTEX) );

       m_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );

       m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 1);

 

       

       m_pd3dDevice->EndScene();

   }



   

   m_pd3dDevice->Present( NULL, NULL, NULL, NULL );

}



//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------

LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )

{

switch(msg)

{

case WM_DESTROY:

 Xeon.Delete();

 PostQuitMessage(0);        

 return 0;              

 

   case WM_PAINT:

       //Xeon.Render();

       ValidateRect( hWnd, NULL );

       return 0;



}

return DefWindowProc(hWnd,msg,wParam,lParam);

}

//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE ,LPSTR ,int )

{

MSG                msg;

 WNDCLASSEX         wcex;



wcex.cbSize = sizeof(WNDCLASSEX);



wcex.style   = CS_CLASSDC;

wcex.lpfnWndProc = (WNDPROC)WndProc;

wcex.cbClsExtra  = 0;

wcex.cbWndExtra  = 0;

wcex.hInstance  = GetModuleHandle(NULL);

wcex.hIcon   = LoadIcon(hInstance, (LPCTSTR)IDI_COCODRIL);

wcex.hCursor  = LoadCursor(NULL, IDC_ARROW);

wcex.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);

wcex.lpszMenuName = NULL;

wcex.lpszClassName = APP_NAME;

wcex.hIconSm  = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_COCODRIL);



RegisterClassEx(&wcex);

HWND hWnd = CreateWindow(APP_NAME,

                 APP_NAME,

     WS_OVERLAPPEDWINDOW,

     CW_USEDEFAULT,

     CW_USEDEFAULT,

     WND_WIDTH,

     WND_HEIGHT,

     NULL,

     NULL,

     wcex.hInstance,

     NULL);

if(SUCCEEDED(Xeon.CreateD3D(hWnd)))

{

      Xeon.Vertices();

   ShowWindow (hWnd, SW_SHOWDEFAULT);

   UpdateWindow(hWnd);

   

      ZeroMemory( &msg, sizeof(msg) );

   while( msg.message!=WM_QUIT )

           {

               if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )

               {

                   TranslateMessage( &msg );

                   DispatchMessage( &msg );

               }

   else

    Xeon.Render();



  }

}

UnregisterClass( APP_NAME, wcex.hInstance );

   return 0;

}




archivo h


#ifndef D3DXEON_H

#define D3DXEON_H





#define D3DFVF_GRID ( D3DFVF_XYZ | D3DFVF_DIFFUSE )

#define D3DFVF_CUSTOMVERTEX ( D3DFVF_XYZ | D3DFVF_DIFFUSE )

struct GRID

{

  D3DXVECTOR3 pos;

  DWORD color;        

};

struct CUSTOMVERTEX

{

  FLOAT x, y, z;      

  DWORD color;

};



class XeonEngine

{

private:



LPDIRECT3D9             m_pD3D;

LPDIRECT3DDEVICE9       m_pd3dDevice;

LPDIRECT3DVERTEXBUFFER9 m_pVB;

GRID malla[5];



public:



XeonEngine();

HRESULT CreateD3D(HWND);

HRESULT Vertices();

HRESULT GridInit();

void Render();

void RenderGrid();

void SetupMatrices();

void Delete();

~XeonEngine(){}

};

#endif




lo curioso esk reinicio el pc... lo vuelvo a compilar y veo un pokitin el triangulo, diria k se ve una arista... :(...
tal vez puede k sea una tonteria... a ver si alguien puede ayudarme  :( ...
testeare el codigo en otro pc a ver si no sale to negro o del color del k haya limpiao el buffer..

salu2                                
Título: PROBLEMA CON D3D9, HELP NEEDED
Publicado por: x-alien en 05 de Enero de 2003, 06:08:29 AM
                                UNA Nota...

tengo puesto en la funcion render a setupmatrices como comentario
//SetupMatrices();


si kito de la funcion render:
SetupMatrices();
RenderGrid();

el triangulo se ve, no entiendo el pork cuando activo la camara... ya no se ve el triangulo, y si se ve algo es alguna aristilla...

salu2                                
Título: PROBLEMA CON D3D9, HELP NEEDED
Publicado por: Lord Trancos en 05 de Enero de 2003, 09:43:07 AM
                                Si no me equivoco tienes el z-buffer creado (y activado), pero no lo limpias en la funcion Clear (este podria ser el problema).

Ademas, aunque el BeginScene falle, despues tienes que llamar a EndScene (aunque eso no creo q sea el problema).

pd. weno.... al menos asi funcionan las cosas en DX8  :loco:                                
Título: PROBLEMA CON D3D9, HELP NEEDED
Publicado por: BeRSeRKeR en 05 de Enero de 2003, 04:11:57 PM
                                A parte de lo que ha dicho Lord Trancos, prueba a poner como tipo de primitiva para pintar el triángulo, D3DPT_TRIANGLELIST. Además, si te fijas, en el método que inicializa el grid, estás especificando la posición siempre para el vértice nº 0.

Con respecto al setup matrices, tienes que llamarlo al menos una vez ya que ahí se especifican la matriz de vista y de proyección.

Saludos                                
Título: PROBLEMA CON D3D9, HELP NEEDED
Publicado por: x-alien en 05 de Enero de 2003, 05:02:58 PM
                                hola, ya se el origen del error por fin =).

el z buffer lo ponia y lo kitaba como muchas cosas pa ver onde ta el error.

el problema esta en el grid, si activo el grid en la funcion render, no se  ve nada, pero si dejo solo setupmatrices ya se ve el triangulo girando...

no se como podria arreglar lo del grid... estoy portando mucho codigo de dx8 a dx9, pero usando clases y perder tiempo en estos errores inignificantes jode..., claro k mejor solucionar un error tonto, k miles...

voy a hacer el grid de la misma manera k el triangulo a ver k sale...

bueno como ya sabeis donde tengo el error(jodio grid), alguien sabe como podria hacerlo para k me salga en pantalla y k cuando lo active, no se me vea to negro xd.

salu2

pd: muchas gracias por la ayuda
pdd: el compilador en w4 me dice un warning y no se pork....
c:Archivos de programaMicrosoft Visual Studio .NETVc7PlatformSDKIncludeMMSystem.h(1837): warning C4201: se ha utilizado una extensión no estándar : struct/union sin especificar
creo k es debido a k uso WIN32_LEAN_AND_MEAN =(

timeGetTime()..
me recomendais usar mejor GetTickCount()??? cual es mas preciso?