Help please, what is wrong
Hello, all i got was a black screen, what is wrong?
#define WIN32_LEAN_AND_MEAN
// The main windows include file
#include <windows.h>
#include <d3d8.h>
#include <d3dx8.h>
//----DIRECT3D GLOBALER------
HWND g_hWnd; // globalt handtag till fönstret.
LPDIRECT3D8 g_pD3D=0; // skapa global pekare som ska rymma Direct3D objektet
LPDIRECT3DDEVICE8 g_pDevice=0; // skapa global pekare som ska rymma själv grafikgrejen som gör att du kan rita på skärmen.
D3DPRESENT_PARAMETERS d3dpp; //device, alla värden för hur skärmen och grafiken ska byggas upp
LPDIRECT3DSURFACE8 g_pBackSurface=0; // skapa tom backbuffer (eller skapa en tom yta)
LPDIRECT3DVERTEXBUFFER8 g_pVB=0; //deklarera en vertexbuffer som kan innehålla koordinaterna
// här nedan i #define har vi valt att vertexstructen ska innehålla
// X,Y,Z RHW koordinater samt DIFFUSE COLOR
// (| betyder och).
#define CUSTOM_ZENVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
//nedan,, tillverka en global struct som innehåller
//koordinaterna och färgen på 3D objektet.
//denna struct hör ihop med vad du väljer i (define CUSTOM_ZENVERTEX)
struct g_ZENVERTEX {
int x;
int y;
int z;
int rhw; // rhw bör vara där så allt går rätt till
DWORD DiffuseColor; // färgen på objektet.
};
//-----SLUT PÅ DIRECT3D GLOBALER----
int Init3D() {
D3DDISPLAYMODE d3ddm; // skapa en struct som innehåller värden för upplösningen på skärmen etc etc.,structen innehåller: width,height, Refreshrate, Format.
D3DPRESENT_PARAMETERS d3dpp; // backbuffer grejer tror jag.
g_pD3D=Direct3DCreate8(D3D_SDK_VERSION); // fyll g_pD3D med den senaste versionen av Direct3D
g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm); // ta reda på vadupplösningen är på skärmen och lägg värdena i d3ddm.
ZeroMemory(&d3dpp,sizeof(D3DPRESENT_PARAMETERS) ); //rensa minnet där d3dpp finns.
//--------------inställningar för backbuffer
d3dpp.BackBufferWidth=800; // skärmupplösning vidden
d3dpp.BackBufferHeight=600; // skärmupplösning höjden
d3dpp.BackBufferFormat= D3DFMT_R5G6B5; //D3DFMT_R5G6B5; //d3ddm.Format;//D3DFMT_X8R8G8B8; //d3ddm.Format är nuvarande skärmläge. testa annars: //; //32-bit RGB pixel format where 8 bits are reserved for each color
d3dpp.BackBufferCount=1; // hur många backbuffers.
d3dpp.MultiSampleType=D3DMULTISAMPLE_NONE; // No level of full-scene multisampling is available
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD; //will be enforced in the debug run time by filling any buffer with noise after it is presented
d3dpp.hDeviceWindow=g_hWnd; // fönstret
d3dpp.Windowed=FALSE; // inge fönster
d3dpp.EnableAutoDepthStencil=TRUE; // så att windows tar hand om depth buffern
d3dpp.AutoDepthStencilFormat=D3DFMT_D16; // 16 bit depth buffer
d3dpp.FullScreen_RefreshRateInHz=0; // default refreshrate på grafikkortet.
d3dpp.FullScreen_PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE; // om det är fullscreen, om det är fönster ska det vara noll.
d3dpp.Flags=D3DPRESENTFLAG_LOCKABLE_BACKBUFFER; //
//skapa Device
g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, // default, primära grafikkortet
D3DDEVTYPE_HAL, // kommer använda Hardware Acceleration
g_hWnd, // handtag till fönstret.
D3DCREATE_SOFTWARE_VERTEXPROCESSING, // Vertices kommer bara bli processad i Mjukvaran., testa MIXED istället för SOFTWARE.
&d3dpp, // lägg resultatet i d3dpp
&g_pDevice); // lägg resultatet i g_pDevice
g_pDevice->GetBackBuffer(0,D3DBACKBUFFER_TYPE_MONO, &g_pBackSurface); // fixa en pekare(pBackSurf) som representerar BackBuffern.
g_pDevice->Clear(0,0,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),0.0f,0); //.rensa backbuffern och Z-buffern.
g_ZENVERTEX ZenVertices[]= // rita upp triangeln
{
{150.0f, 50.0f,0.5f, 1.0f, D3DCOLOR_XRGB(255,0,0), }, //X,Y,Z, RHW, COLOR
{250.0f, 250.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255,255,0), },
{50.0f, 250.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0,0,255), },
};
// skapa en vertexbuffer men storleken 3 gånger större än g_ZENVERTEX (3=antal punkter)
// dock får man bara fram Objektet "Vertexbuffer", men inte adressen där den ligger i minnet.
// Hur man får fram den ser du nedan.
g_pDevice->CreateVertexBuffer(sizeof(g_ZENVERTEX)*3,0,CUSTOM_ZENVERTEX,D3DPOOL_DEFAULT,&g_pVB);
// får nedan man fram Adressen till Vertexbuffern, och adressen kommer ligga i pVertices.
BYTE* pVertices=0;
g_pVB->Lock(0,sizeof(ZenVertices),&pVertices,0);
CopyMemory(pVertices,&ZenVertices,sizeof(ZenVertices)); //nu kommer pVertices peka på adressen där vertexbuffern ligger
g_pVB->Unlock();
ZeroMemory( &d3dpp, sizeof(d3dpp) ); // rensa minnet
return 0;
}
int Render() {
g_pDevice->Clear(0,0,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),0.0f,0); //.rensa backbuffern.
// detta nedan är för att komma åt minnet och skriva direkt dit.
// men det behövs förmodligen inte om du inte vill..
//D3DLOCKED_RECT pLockedRect; // rektangelytan i minnet man ska rita på.
//g_pBackSurface->LockRect(&pLockedRect,NULL,0); //returnera pekare till ytan
//g_pBackSurface->UnlockRect();
g_pDevice->BeginScene(); // börja rita 3D
g_pDevice->SetStreamSource(0,g_pVB,sizeof(g_ZENVERTEX)); // göra så att den streamar ut vertexbuffern till kortet.
g_pDevice->SetVertexShader(CUSTOM_ZENVERTEX); //
g_pDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,1);
//------här lägger du in grafik som ska renderas.----------------------------------------
//------slut på grafikrendering ----------------------------------------------------------------
g_pDevice->EndScene(); // avsluta rita 3D
g_pDevice->Present(NULL,NULL,NULL,NULL); // kopiera backbuffern till primära, alltså visa backbuffern.
return 0;
}
Don''t know if this is all that is wrong, but...
The ints should be floats in your structure.
struct g_ZENVERTEX {
int x;
int y;
int z;
int rhw; // rhw bör vara där så allt går rätt till
DWORD DiffuseColor; // färgen på objektet.
};
Bill6
The ints should be floats in your structure.
struct g_ZENVERTEX {
int x;
int y;
int z;
int rhw; // rhw bör vara där så allt går rätt till
DWORD DiffuseColor; // färgen på objektet.
};
Bill6
See if either of these fix it.
Try disabling back face culling { SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE) }
Don''t create a depth buffer.(remove D3DCLEAR_ZBUFFER from clear also )
Try disabling back face culling { SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE) }
Don''t create a depth buffer.(remove D3DCLEAR_ZBUFFER from clear also )
I noticed you are clearing your zbuffer to 0.0f, try:-
g_pDevice->ClearClear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER , 0, 1.0f, 0 );
See if that works, failing that I suggest you compile one of the relevant tutorials, then use that as your base.
g_pDevice->ClearClear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER , 0, 1.0f, 0 );
See if that works, failing that I suggest you compile one of the relevant tutorials, then use that as your base.
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement