Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

02.06.2013, 09:54

[GELÖST]Es wird nichts gerendert (?)

Hallo,
ich habe versucht jetzt einmal ohne der TriBase-Engine auszukommen, aber ich scheitere kläglich
ich bekomm kein Dreieck mehr auf den Bildschirm, geschweige denn ein Model.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include "stdafx.h"
#include "CGame.h"

SVertex vertices[3];
int color;

HRESULT CGame::Init(HWND hWnd){
    HRESULT hRes;
    //Direct3D
    hRes = InitDirect3D(hWnd);
    CHECK(hRes);
    //Die Szene erstellen
    hRes = InitScene();
    CHECK(hRes);
    return true;
}

HRESULT CGame::InitDirect3D(HWND window){
    //D3d Object
    IDirect3D9 *d3dobj = Direct3DCreate9(D3D9b_SDK_VERSION);
    
    //Parameter
    D3DPRESENT_PARAMETERS pp;
    ZeroMemory(&pp,sizeof(pp));
    pp.AutoDepthStencilFormat = D3DFMT_D16;
    pp.BackBufferCount = 1;
    pp.BackBufferFormat = D3DFMT_R5G6B5;
    pp.BackBufferHeight = 0;
    pp.BackBufferWidth = 0;
    pp.EnableAutoDepthStencil = TRUE;
    pp.Flags = D3DPRESENTFLAG_DEVICECLIP;
    pp.FullScreen_RefreshRateInHz = 0;
    pp.hDeviceWindow = window;
    pp.MultiSampleQuality = 0;
    pp.MultiSampleType = D3DMULTISAMPLE_NONE;
    pp.PresentationInterval = 0;
    pp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    pp.Windowed = TRUE;

    //Init Device
    HRESULT hRes =  d3dobj->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, NULL, D3DCREATE_HARDWARE_VERTEXPROCESSING, &pp, &device);
    //Aufräumen
    d3dobj->Release();
    return hRes;
}

HRESULT CGame::InitScene(){
    //Matrizen generieren
    //View-Matrix
    D3DXVECTOR3 eye(0.0f,0.0f,0.0f);
    D3DXVECTOR3 at(0.0f,0.0f,0.0f);
    D3DXVECTOR3 up(0.0f,1.0f,0.0f);
    D3DXMATRIX view;
    D3DXMatrixLookAtRH(&view,&eye,&at,&up);
    device->SetTransform(D3DTS_VIEW, &(D3DMATRIX)(view));
    //Prokection Matrix
    D3DXMATRIX projection;
    D3DXMatrixPerspectiveFovLH(&projection,0.785f,1600/900,0.01f,100.0f);
    device->SetTransform(D3DTS_PROJECTION, &(D3DMATRIX)(projection));
    //Render-States
    device->SetRenderState(D3DRS_LIGHTING, false);
    device->SetFVF(D3DFVF_XYZ|D3DFVF_TEX1);
    device->SetRenderState (D3DRS_ZENABLE, D3DZB_TRUE);
    device->SetRenderState (D3DRS_CULLMODE, D3DCULL_NONE);
    //Models laden
    HRESULT hRes;
    hRes =  D3DXLoadMeshFromX("scene\\models\\house.x",D3DXMESH_MANAGED,device,NULL,NULL,NULL,NULL,&ground);
    //CHECK(hRes); <- Auskommtentiert, damit Programm nicht beendet
    hRes =  D3DXCreateTextureFromFile(device,"scene\\textures\\ground.png",&ground_tex);
    CHECK(hRes);
    //Ein paar Vertices erstellen
    SVertex v;
    ZeroMemory(&v,sizeof(v));
    v.x = 1.0f; v.y = 0.0f; v.z=1.0f; v.u = 1.0f; v.v = 0.0f; vertices[0] = v;
    v.x = -1.0f; v.y = 0.0f; v.z=1.0f; v.u = -1.0f; v.v = 0.0f; vertices[1] = v;
    v.x = 0.0f; v.y = 1.0f; v.z=1.0f; v.u = 0.0f; v.v = 1.0f; vertices[2] = v;
    
    return 0;
}
void CGame::Render(){
    HRESULT hRes;
    device->BeginScene();
    //Zeichen
    //z-Buffer löschen
    device->Clear(NULL,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(52,52,color),1.0f,0);
    /*//Objekt bewegen
    D3DXMATRIX world;
    D3DXMatrixTranslation(&world,0.0f,0.0f,5.0f);
    device->SetTransform(D3DTS_WORLD, &(D3DMATRIX)(world));*/
    device->SetTexture(0,ground_tex);
//  ground->DrawSubset(0);
    hRes = device->DrawPrimitiveUP(D3DPT_TRIANGLELIST,1,&vertices,sizeof(SVertex)*3);
    device->EndScene();
    device->Present(NULL,NULL,NULL,NULL);
    //Aufräumen
    ground_tex->Release();
}
void CGame::Move(float sec){
    
};

Das Makro CHECK prüft einfach, ob die Methode fehlschlägt und gibt dann das HRESULT zurück...
Ich weiß nicht, ob wirklich was gerendert wird, man sieht jedenfalls nichts - ich habe eher meine Unkenntnis in D3DX Funktionen im Verdacht und die
Kamera wird so stehen, dass sie vom Dreieck abgewand ist... :rolleyes:
Hoffe ihr könnte helfen...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »haansn08« (02.06.2013, 18:34)


2

02.06.2013, 12:54

Habe mal kurz den Source überflogen. Da viel mir auf, dass du in Zeile 92 in DrawPrimitiveUP im letzten Parameter die Vertexgröße mit 3 Multiplizierst. Es wird nicht die Größe der zu rendernden Primitive erwartet, sonden die Größe eines einzelnden Vertex.

Außerdem hast du in der Initialisierung das d3dobj released. Es muss aber die ganze Zeit noch zur verfügung stehen. In DirectX muss man darauf achten in einer bestimmten Reihenfolge die Objekte zu erstellen und in der genau entgegengesetzten die Objekte mit Release freigeben.

Kommen wir zum nächsten Punkt: D3DXMatrixLookAtRH. Eye ist der Standpunkt an dem du stehst. Du stehst also an Punkt [0,0,0]. At ist der Punkt den du anschaust. Du schaust den Punkt an auf dem du stehst, wenn du aber das Dreieck ansehen willst musst du [0,0,1] wählen.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Hannes« (02.06.2013, 13:13)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

02.06.2013, 14:20

Abgesehen davon, würd mich sehr interessieren, wieso genau du mit 16Bit Farben (D3DFMT_R5G6B5) arbeitest... ;)

4

02.06.2013, 14:34

In DirectX muss man darauf achten in einer bestimmten Reihenfolge die Objekte zu erstellen und in der genau entgegengesetzten die Objekte mit Release freigeben.

Ist das ne Faustregel? Werd' ich mir merken :D

16-Bit Farbe? Das war wenigstens ein Flag das funktioniert hat... :whistling:

//Edit: Könnte das mit dem Freigeben auch erklären, warum mein Model nicht läd? Ich gebkomm glaub' ich nen anderen Fehlercode (0x88760390) 8|
//Edit 2: Der Code heißt übersetzt: File could not be parsed.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »haansn08« (02.06.2013, 14:39)


5

02.06.2013, 14:42

Der Fehlercode bedeutet:
HRESULT: 0x88760390 (2289435536)
Name: D3DXFERR_PARSEERROR
Description: Parse error
Severity code: Failed
Facility Code: FACILITY_D3D (2166)
Error Code: 0x0390 (912)

Ich schätze mal die Daten in der Datei verursachen den fehler.

6

02.06.2013, 14:45

Hm, ich probier mal eine andere Datei, die schon mal funktioniert hat.... ^^

//Edit: Ich exportiere Blender-Models mit dem DirectX-Exporter...
//Edit 2: Also die andere Datei kann er laden... Es muss sich was am Exporter geändert haben, hat irgendwer Erfahrung mit der neusten Version (Blender 2.67)

7

02.06.2013, 15:40

Gibt es irgendeine andere Möglichkeit ein Model aus Blender zu exportieren, das ich (ohne großen Aufwand oder zusätzlichen Bibliotheken) importieren kann?

8

02.06.2013, 18:33

Es funktioniert jetzt alles - ich habe eine frühere Version des Exporters genommen. Am Code war anscheinend nichts falsch...

Werbeanzeige