|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
telebeppo Mini JLI'ler
Anmeldedatum: 17.11.2008 Beiträge: 36
Medaillen: Keine
|
Verfasst am: 04.05.2010, 15:34 Titel: Problem bei der Darstellung von 3D-Objekt |
|
|
Guten Tag allerseits,
in meinem embrionalen C++ Programm möchte ich auch 3D-Objekte (X-files) verwenden. Leider läuft beim Rendern irgend etwas schief. Und zwar erscheinen bestimmte Teile der Objekte im Vordergrund, obwohl sie im Hintergrund sein müßten und umgekehrt. Ich dachte, das kann nur mit dem Z-buffering oder dem DepthStencil Einstellungen zu tun haben und habe das alles nachgeprüft, aber den Fehler habe ich nicht finden können.
Hier ein zwei Abschnitte aus dem Programm:
CPP: | BOOL CGrafik::Init(HWND hGriff, BOOL bWindowed)
{
D3D = Direct3DCreate9(D3D_SDK_VERSION);
D3DPRESENT_PARAMETERS PParams;
ZeroMemory(&PParams, sizeof(PParams));
PParams.BackBufferWidth = Breite;
PParams.BackBufferHeight = Hoehe;
PParams.BackBufferFormat = D3DFMT_A8R8G8B8;
PParams.BackBufferCount = 0;
PParams.MultiSampleType = D3DMULTISAMPLE_NONE;
PParams.MultiSampleQuality = 0;
PParams.SwapEffect = D3DSWAPEFFECT_DISCARD;
PParams.hDeviceWindow = hGriff;
PParams.Windowed = FALSE;
PParams.EnableAutoDepthStencil = TRUE;
PParams.AutoDepthStencilFormat = D3DFMT_D16;
PParams.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
PParams.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
m_ClearColor = 0x000000;
HRESULT hr;
if(FAILED(hr = D3D->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hGriff,
D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE,
&PParams,
&Grafik_Geraet)))
|
Hier der zweite Abschnitt, der an dem Problem schuld sein könnte:
CPP: | void Szene_Initialisieren(LPDIRECT3DDEVICE9 lpDevice, CRechnerVerwaltung* Verwaltung)
{
Grafikkarte = Grafik.GetDevice();
Grafikkarte->SetFVF(SCHEITELPUNKTFORMAT_B);
m_RVerwaltung = Verwaltung;
D3DXMatrixIdentity(&Weltmatrix);
Grafikkarte->SetTransform(D3DTS_WORLD,&Weltmatrix);
Standort = D3DXVECTOR3(0.0f, 0.0f, -1000.0f);
k_Standort = D3DXVECTOR3(0.0f, 0.0f, -8.6f);
Blickpunkt = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
Buehne_Eins.X = 0;
Buehne_Eins.Y = 0;
Buehne_Eins.Width = BSchirmbreite;
Buehne_Eins.Height = BSchirmhoehe;
Buehne_Eins.MinZ = 0.0f;
Buehne_Eins.MaxZ = 1.0f;
Buehne_Zwei.X = BSchirmbreite-157;
Buehne_Zwei.Y = BSchirmhoehe-141;
Buehne_Zwei.Width = 120;
Buehne_Zwei.Height = 120;
Buehne_Zwei.MinZ = 0.0f;
Buehne_Zwei.MaxZ = 1.0f;
D3DXMatrixLookAtLH(&k_Perspektive,
&k_Standort,
&Blickpunkt,
&Orientierung);
Grafikkarte->SetTransform(D3DTS_VIEW,&k_Perspektive);
D3DXMatrixPerspectiveFovLH( &k_Projektion, 1.0f, 1.0f, 0.2f, 12.0f );
Grafikkarte->SetTransform(D3DTS_PROJECTION, &k_Projektion);
D3DXMatrixLookAtLH(&Perspektive,
&Standort,
&Blickpunkt,
&Orientierung);
Grafikkarte->SetTransform(D3DTS_VIEW,&Perspektive);
D3DXMatrixPerspectiveFovLH( &Projektion, 1.0f, fAspekt, 0.0f, 1000.0f );
Grafikkarte->SetTransform(D3DTS_PROJECTION, &Projektion);
m_bGrossAktiv = false;
m_bObenAktiv = false;
m_bUntenAktiv = false;
ZeroMemory( &Material, sizeof(Material) );
Material.Diffuse.r = Material.Ambient.r = 1.0f;
Material.Diffuse.g = Material.Ambient.g = 1.0f;
Material.Diffuse.b = Material.Ambient.b = 1.0f;
Material.Diffuse.a = Material.Ambient.a = 1.0f;
Grafikkarte->SetMaterial( &Material);
ZeroMemory(&Licht_0,sizeof(D3DLIGHT9));
Licht_0.Type = D3DLIGHT_DIRECTIONAL;
Licht_0.Diffuse.r = 1.0f;
Licht_0.Diffuse.g = 1.0f;
Licht_0.Diffuse.b = 1.0f;
Licht_0.Diffuse.a = 1.0f;
Licht_0.Specular.r = 0.5f;
Licht_0.Specular.g = 0.5f;
Licht_0.Specular.b = 0.5f;
Licht_0.Specular.a = 0.5f;
Licht_0.Ambient.r = 0.0001f;
Licht_0.Ambient.g = 0.0001f;
Licht_0.Ambient.b = 0.0004f;
Licht_0.Ambient.a = 0.01f;
Licht_0.Direction = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
Licht_0.Position = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
Licht_0.Range = 1000.0f;
Licht_0.Attenuation0 = 1.0f;
Licht_0.Attenuation1 = 1.0f;
Licht_0.Attenuation2 = 1.0f;
Licht_0.Theta = 2.0f;
Licht_0.Phi = 1.0f;
Licht_0.Falloff = 1.0f;
Grafikkarte->SetLight(0,&Licht_0);
Grafikkarte->LightEnable(0,TRUE);
Grafikkarte->SetRenderState(D3DRS_LIGHTING,TRUE);
Grafikkarte->SetRenderState( D3DRS_AMBIENT, 0x00F0F0F0 );
Grafikkarte->SetRenderState( D3DRS_DITHERENABLE, TRUE );
Grafikkarte->SetRenderState( D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
Grafikkarte->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID );
Grafikkarte->SetRenderState( D3DRS_ZENABLE, D3DZB_TRUE);
Grafikkarte->SetRenderState( D3DRS_CLIPPING, TRUE );
Grafikkarte->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW );
|
Hoffentlich weiß jemand Rat. |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 04.05.2010, 19:16 Titel: |
|
|
Der Initialisierungscode sieht in Ordnung aus.
Möglicherweise stimmt der Rendercode noch nicht:
- BeginSzene / EndSzene benutzt?
- Backbuffer gecleart?
Such mal dort!
MfG _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
telebeppo Mini JLI'ler
Anmeldedatum: 17.11.2008 Beiträge: 36
Medaillen: Keine
|
Verfasst am: 05.05.2010, 20:49 Titel: Dank |
|
|
Wärmsten Dank für die Antwort. Hier noch die Stelle, wo die Szene gerendert wird:
CPP: | if (Bild_erstellt && !globus)
Grafikkarte->StretchRect(Vordergrund, 0, Hintergrund, 0, D3DTEXF_NONE);
else
{
Grafikkarte->Clear(0,NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0),1.0f,0);
Grafikkarte->BeginScene();
D3DXMatrixLookAtLH(&Perspektive,
&Standort,
&Blickpunkt,
&Orientierung);
Grafikkarte->SetTransform(D3DTS_VIEW, &Perspektive);
Grafikkarte->SetTransform(D3DTS_PROJECTION, &Projektion);
Flugzeug.Zeichnen(); //Das ist das X-file
Grafikkarte->EndScene();
Grafikkarte->Present(0,0,0,0);
} |
Ich schnalls nicht! |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 10.05.2010, 21:42 Titel: |
|
|
Du hast die Kamera nicht Positioniert?
Die Kamera befindet sich genau IM Modell (xFile)?
Das Flugzeug (xFile) hat einige Flächen, welche "verkehrt herum" gezeichnet werden (Aussen- und Innenseite einer Fläche)?
Der Code scheint wiederum in Ordnung zu sein. _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
telebeppo Mini JLI'ler
Anmeldedatum: 17.11.2008 Beiträge: 36
Medaillen: Keine
|
Verfasst am: 14.05.2010, 15:06 Titel: |
|
|
Hallo MVP und die anderen, die versucht haben zu helfen,
Alle Deine Fragen, MVP, kann ich verneinen.
Ich bin zu einer früheren Version meines Programms zurückgegangen und dort funktioniert die Darstellung einwandfrei. Ich werde die beiden Versionen genau untersuchen. Da ich die frühere Version mit Funtionen der neueren ausstatten will um auf die gleiche Funktionalität zu kommen, die ich bereits erreicht habe, werde ich bei jeder größeren Veränderung des Programms darauf achten, ob die Darstellung der X-Files weiterhin funktioniert. Sobald ich herausgefunden habe, was für die Falschdarstellung verantwortlich ist, melde ich es hier.
Einstweilen erst einmal Danke für die Bemühungen. |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 14.05.2010, 15:47 Titel: |
|
|
Okay _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
telebeppo Mini JLI'ler
Anmeldedatum: 17.11.2008 Beiträge: 36
Medaillen: Keine
|
Verfasst am: 31.05.2010, 15:40 Titel: Problem gelöst |
|
|
Ich habe das Problem beheben können. Merkwürdig ist nur, daß es tatsächlich an dem ZPuffer gelegen hat, was ich ja bereits versucht hatte. |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|