Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





PROBLEMA CON D3D9, HELP NEEDED

Iniciado por x-alien, 05 de Enero de 2003, 05:53:11 AM

« anterior - próximo »

x-alien

                                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                                
oy Grafista, no Programador, aun así programo mejor que un 'programador'

x-alien

                                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                                
oy Grafista, no Programador, aun así programo mejor que un 'programador'

Lord Trancos

                                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:                                
i>SaludoteZ de Lord Trancos!
http://www.dxlab.tk - http://dxlab.host.sk - programación de DirectX con Delphi.

BeRSeRKeR

                                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                                
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

x-alien

                                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?                                
oy Grafista, no Programador, aun así programo mejor que un 'programador'






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.