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

Andreas

Frischling

  • »Andreas« ist der Autor dieses Themas

Beiträge: 77

Beruf: Schüler

  • Private Nachricht senden

21

09.02.2008, 20:27

Hi,
das mit der y-Koordinate hat leider (zumindest bei mir) auch nichts gebracht.

Zitat

1.Grafiktreiber aktualisieren.
2: Antialiasing, AF und sonstige "Optimierungen" des Treibers deaktivieren.


Dann müsste bei euch die Ebene ja normal dargestellt werden:
http://www.mehringskoetter.de/files/Daten(1).zip

Der aktuelle Quelletext lautet:
http://www.mehringskoetter.de/files/Modelle(1).cpp

Läuft es denn bei euch?

Viele Grüße
Andreas

Andreas

Frischling

  • »Andreas« ist der Autor dieses Themas

Beiträge: 77

Beruf: Schüler

  • Private Nachricht senden

22

09.02.2008, 20:34

mir ist gerade eingefallen, dass ihr vielleicht die Ebene vor Nebel gar nicht sehen könnt, deshalb hier einmal mit auskommentierten Nebel:
http://www.mehringskoetter.de/files/Modelle.exe
(Die Tribase und die Ebene.jpg bleiben ja die gleiche)

Andreas

Frischling

  • »Andreas« ist der Autor dieses Themas

Beiträge: 77

Beruf: Schüler

  • Private Nachricht senden

23

09.02.2008, 21:25

Ich hab den Fehler gefunden, warum die Ebene so verschwommen war:

Es kommt darauf an, in welcher Reihenfolge die Daten in der Vertexstruktur angeordnet werden!!

Ich hab jetzt grad den Rechner, bei dem das Nebelproblem auftrat nicht zur verfügung, funktioniert der Nebel denn jetzt bei euch:
http://www.mehringskoetter.de/files/Daten(2).zip

Andreas

Frischling

  • »Andreas« ist der Autor dieses Themas

Beiträge: 77

Beruf: Schüler

  • Private Nachricht senden

24

09.02.2008, 22:20

Hallo, ich habs von einem Freund über ICQ nochmal ausprobieren lassen und der meinte der Fehler würde immer noch bestehen.
Ich hab dann die Ebene nicht mehr manuell mit den Vertices erstellt, sondern ein Tribase-Model gemacht, dass dann gerendert wird.

http://www.mehringskoetter.de/files/Daten(3).zip

Allerdings meinte mein Freund, dass auch hierbei die Ebene weiß gewesen sei.
Warum wird das bei mir "vernünftig" dargestellt und bei sehr vielen nicht? Die Vertices, von denen der Nebel ausgeht sind ja alle sehr weit entfernt, kann das sein, dass er irgendwie falsch interpoliert?
Ich hab dann nochmal die Ebene des Models nicht in 2 Dreiecke aufgeteilt, sondern in 20000. Das lief dann auch bei meinem Freund so wie bei mir mit 2 Dreiecken. Jetzt sind aber 20000 Dreiecke allein für eine Ebene schon sehr "teuer".
Könnte man das nicht Pixelnebel lösen, so dass es trotzdem funktioniert?

Bei mir ist das Problem, dass ich das immer so schwer ausprobieren kann:

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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
#include "Include//TriBase.h"
#include "Resource.h"

#define Kartengrosse 100.0f
#define Geschwindigkeit 5.0f

// Struktur für einen Vertex der Ebeneoberfläche

struct SEbeneVertex
{
    tbVector3           vPosition;  // Position

    tbVector3           vNormal;
    tbVector2           vTexture;   // 2D-Texturkoordinaten


    static const DWORD  dwFVF;      // Vertexformat

};

const DWORD SEbeneVertex::dwFVF = D3DFVF_XYZ | D3DFVF_TEX1 | D3DFVF_NORMAL;


tbResult InitEbene();
// ******************************************************************

// Globale Variablen

tbConfig                g_Config;                       // Konfigurationsstruktur

tbVector3               g_vCameraPos;                   // Kameraposition

float                   g_fCameraRot;                   // Rotation der Kamera

float                   g_fCameraUpDown;                // Schaut die Kamera hoch oder runter?

float                   g_fFOV = TB_DEG_TO_RAD(90.0f);  // Sichtfeld

float                   g_fTime = 0.0f;                 // Globaler Zeitzähler

PDIRECT3DTEXTURE9       g_pEbeneTexture;                // Ebenetextur

tbVertexBuffer*         g_pEbeneVB;                     // Ebene-Vertex-Buffer

tbIndexBuffer*          g_pEbeneIB;                     // Ebene-Index-Buffer


tbVector3   vCameraDir;


// ******************************************************************

// Die Move-Funktion

tbResult MoveProc(float fNumSecsPassed)
{


    // Den Zeitzähler aktualisieren

    g_fTime += fNumSecsPassed;

    // Tastatursteuerung...

    vCameraDir = tbVector3(sinf(g_fCameraRot) * cosf(g_fCameraUpDown),
                           sinf(g_fCameraUpDown),
                           cosf(g_fCameraRot) * cosf(g_fCameraUpDown));

    if(GetAsyncKeyState(VK_LEFT))       g_fCameraRot -= 0.5f * fNumSecsPassed;
    if(GetAsyncKeyState(VK_RIGHT))      g_fCameraRot += 0.5f * fNumSecsPassed;
    if(GetAsyncKeyState(VK_UP))         g_fCameraUpDown -= 0.5f * fNumSecsPassed;
    if(GetAsyncKeyState(VK_DOWN))       g_fCameraUpDown += 0.5f * fNumSecsPassed;
    if(GetAsyncKeyState(VK_F1))     g_vCameraPos += vCameraDir * 5.0f * fNumSecsPassed;
    if(GetAsyncKeyState(VK_F2)) g_vCameraPos -= vCameraDir * 5.0f * fNumSecsPassed;

    if(GetAsyncKeyState(VK_F3))
    {
        PDIRECT3DSURFACE9   pBackBuffer;    
        // Bildpuffer abfragen und in Datei speichern

        tbDirect3D::Instance().GetDevice()->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer);
        D3DXSaveSurfaceToFile("Screeny.bmp", D3DXIFF_BMP, pBackBuffer, NULL, NULL);
        pBackBuffer->Release();
    }


    // Die Tasten "Bild auf" und "Bild ab" verändern das Sichtfeld.

    // So kann man in das Bild "hineinzoomen", mit 15 Grad pro Sekunde.

    if(GetAsyncKeyState(VK_PRIOR)) g_fFOV -= TB_DEG_TO_RAD(15.0f) * fNumSecsPassed;
    if(GetAsyncKeyState(VK_NEXT)) g_fFOV += TB_DEG_TO_RAD(15.0f) * fNumSecsPassed;

    // Das Sichtfeld darf 180° und 0° nicht erreichen.

    if(g_fFOV >= TB_DEG_TO_RAD(180.0f)) g_fFOV = TB_DEG_TO_RAD(179.9f);
    else if(g_fFOV <= TB_DEG_TO_RAD(0.0f)) g_fFOV = TB_DEG_TO_RAD(0.1f);

    return TB_OK;
}

// ******************************************************************

// Die Render-Funktion

tbResult RenderProc(float fNumSecsPassed)
{
    tbMatrix    mProjection;
    tbMatrix    mCamera;
    tbMatrix    mWorld;

    D3DLIGHT9   Light;
    //int           iNumPasses;

    

    // Kameramatrix erstellen und einsetzen

    
        vCameraDir = tbVector3(sinf(g_fCameraRot) * cosf(g_fCameraUpDown),
                           sinf(g_fCameraUpDown),
                           cosf(g_fCameraRot) * cosf(g_fCameraUpDown));

    // Z-Buffer leeren und die Szene beginnen

    tbDirect3D& D3D = tbDirect3D::Instance();
    //D3D->Clear(0, NULL, D3DCLEAR_ZBUFFER, 0, 1.0f, 0);

    D3D->Clear(0, 
                           NULL, 
                           D3DCLEAR_TARGET, 
                           D3DCOLOR_XRGB(1,1,1), 
                           1.0f, 
                           0);
    D3D->Clear(0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(1,1,1), 1.0f, 0);

    D3D->BeginScene();

    // Projektionsmatrix erstellen und einsetzen

    mProjection = tbMatrixProjection(g_fFOV, D3D.GetAspect(), 0.1f, 1000.0f);
    D3D.SetTransform(D3DTS_PROJECTION, mProjection);


    mCamera = tbMatrixCamera(g_vCameraPos, g_vCameraPos + vCameraDir);
    D3D.SetTransform(D3DTS_VIEW, mCamera);


    D3D.SetRS(D3DRS_FOGENABLE,      TRUE);
    D3D.SetRS(D3DRS_FOGVERTEXMODE,  D3DFOG_LINEAR);
    D3D.SetRS(D3DRS_FOGTABLEMODE, D3DFOG_NONE);
    D3D.SetRS(D3DRS_FOGCOLOR, tbColor(1.0f, 1.0f, 1.0f));
    D3D.SetRSF(D3DRS_FOGSTART,      3.0f);
    D3D.SetRSF(D3DRS_FOGEND,        6.0f);
    if(D3D.SetRS(D3DRS_RANGEFOGENABLE, FALSE)!= TB_OK) TB_ERROR("NEBEL FUNTZT NICHT", TB_ERROR);
    D3D->SetRenderState(D3DRS_LIGHTING, FALSE);

    D3D.SetTransform(D3DTS_WORLD, tbMatrixIdentity());

    // Datenquellen und Vertexformat setzen

    D3D.SetTexture(0, g_pEbeneTexture);
    D3D->SetStreamSource(0, g_pEbeneVB->GetVB(), 0, sizeof(SEbeneVertex));
    D3D->SetIndices(g_pEbeneIB->GetIB());
    D3D.SetFVF(SEbeneVertex::dwFVF);
    

    D3D->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0,
                                  4, 0,
                                  2);

    // Szene beenden

    D3D->EndScene();

    return TB_OK;
}


// ******************************************************************

// Aufräumen

tbResult CleanUp()
{

    tbDirect3D::Instance().Exit();
    tbTextureManager::Instance().Exit();

    // Die TriBase-Engine herunterfahren

    tbExit();

    return TB_OK;
}

// ******************************************************************

// Windows-Hauptfunktion

int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   char* pcCommandLine,
                   int iShowCommand)
{
    // TriBase-Engine initialisieren

    tbInit();

    // Konfiguration abfragen

    tbResult r;
    if(r = tbDoConfigDialog(&g_Config))
    {
        if(r == TB_CANCELED) return 0;
        else
        {
            // Fehler!

            MessageBox(NULL, "Fehler im Konfigurationsdialog!", "Fehler",
                       MB_OK | MB_ICONEXCLAMATION);
            return 1;
        }
    }

    // Direct3D initialisieren

    if(tbDirect3D::Instance().Init(&g_Config,
                                   "Beispielprogramm Nr. 2: Modelle",
                                   NULL,
                                   LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1))))
    {
        // Fehler!

        MessageBox(NULL, "Fehler bei der Direct3D-Initialisierung!", "Fehler",
                   MB_OK | MB_ICONEXCLAMATION);
        CleanUp();
        return 1;
    }

    // Den Texturmanager initialisieren

    if(tbTextureManager::Instance().Init())
    {
        MessageBox(tbDirect3D::Instance().GetWindow(), "Fehler beim Initialisieren des Texturmanagers!",
                   "Fehler", MB_OK | MB_ICONEXCLAMATION);
        CleanUp();
        return 1;
    }


    InitEbene();
    // Kamera initialisieren

    g_vCameraPos = tbVector3(0.0f, 0.1f, 0.0f);
    g_fCameraRot = TB_DEG_TO_RAD(90.0f);
    g_fCameraUpDown = 0.0f;

    // Nachrichtenschleife betreten

    if(tbDoMessageLoop(MoveProc, RenderProc))
    {
        MessageBox(tbDirect3D::Instance().GetWindow(), "Fehler beim Zeichnen!",
                   "Fehler", MB_OK | MB_ICONEXCLAMATION);
        CleanUp();
        return 1;
    }

    // Aufräumen

    CleanUp();

    return 0;
}

tbResult InitEbene()
{
        
    SEbeneVertex    Vertex;

    g_pEbeneVB = new tbVertexBuffer;
    if(g_pEbeneVB->Init(4 * sizeof(SEbeneVertex), sizeof(SEbeneVertex), SEbeneVertex::dwFVF,
                        D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, D3DPOOL_DEFAULT))
    {
        // Fehler!

        return TB_ERROR;
    }

    g_pEbeneIB = new tbIndexBuffer;
    if(g_pEbeneIB->Init(6 * sizeof(WORD), sizeof(WORD), D3DFMT_INDEX16))
    {
        // Fehler!

        return TB_ERROR;
    }

    WORD    wIndex;

    wIndex = 0;     g_pEbeneIB->AddIndex(&wIndex);
    wIndex = 1;     g_pEbeneIB->AddIndex(&wIndex);
    wIndex = 3;     g_pEbeneIB->AddIndex(&wIndex);

            // Zweites Dreieck

    wIndex = 1;     g_pEbeneIB->AddIndex(&wIndex);
    wIndex = 2;     g_pEbeneIB->AddIndex(&wIndex);
    wIndex = 3;     g_pEbeneIB->AddIndex(&wIndex);

    if(g_pEbeneIB->Update()) return TB_ERROR;

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


    // Die Textur der Ebenenoberfläche laden

    g_pEbeneTexture = tbTextureManager::Instance().GetTexture("Ebene.jpg", TRUE, D3DX_DEFAULT, D3DX_DEFAULT, 1, D3DFMT_UNKNOWN, 0, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, D3DCOLOR_XRGB(255, 0, 255));
    if(g_pEbeneTexture == NULL) return TB_ERROR;

    Vertex.vPosition.x = -Kartengrosse/2.0f;
    Vertex.vPosition.y = 0.0f;
    Vertex.vPosition.z = Kartengrosse/2.0f;
    Vertex.vTexture = tbVector2(Vertex.vPosition.x, Vertex.vPosition.z);//TextureProc(Vertex.vPosition);

    Vertex.vNormal = tbVector3(0.0f, 1.0f, 0.0f);
    g_pEbeneVB->SetVertex(0, &Vertex);
    
    Vertex.vPosition.x = Kartengrosse/2.0f;
    Vertex.vPosition.y = 0.0f;
    Vertex.vPosition.z = Kartengrosse/2.0f;
    Vertex.vTexture = tbVector2(Vertex.vPosition.x, Vertex.vPosition.z);//TextureProc(Vertex.vPosition);

    Vertex.vNormal = tbVector3(0.0f, 1.0f, 0.0f);
    g_pEbeneVB->SetVertex(1, &Vertex);

    Vertex.vPosition.x = Kartengrosse/2.0f;
    Vertex.vPosition.y = 0.0f;
    Vertex.vPosition.z = -Kartengrosse/2.0f;
    Vertex.vTexture = tbVector2(Vertex.vPosition.x, Vertex.vPosition.z);//TextureProc(Vertex.vPosition);

    Vertex.vNormal = tbVector3(0.0f, 1.0f, 0.0f);
    g_pEbeneVB->SetVertex(2, &Vertex);


    Vertex.vPosition.x = -Kartengrosse/2.0f;
    Vertex.vPosition.y = 0.0f;
    Vertex.vPosition.z = -Kartengrosse/2.0f;
    Vertex.vTexture = tbVector2(Vertex.vPosition.x, Vertex.vPosition.z);//TextureProc(Vertex.vPosition);

    Vertex.vNormal = tbVector3(0.0f, 1.0f, 0.0f);
    g_pEbeneVB->SetVertex(3, &Vertex);


    if(g_pEbeneVB->Update()) return TB_ERROR;

    
    return TB_OK;
}


Bei euch tritt der Fehler doch auf und hier ist der Quellcode, könntet ihr nicht einmal mit ein paar Nebeleinstellungen (wahrscheinlich dann Pixelnebel) rumspielen und mir dann sagen was funktioniert hat (außer FogEnd und FogStart auf sehr große Werte zu setzen), das wäre echt nett!!!

Vielen Dank und viele Grüße
Andreas

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

25

09.02.2008, 23:08

meinst du es liegt am nebel?
funktioniert es wenn du den nebel ausmachst?
was ist für ein textureaddressmode eingestellt!?
haben die verwendeten texturen alle abmessungen die eine potenz von 2 sind?

Andreas

Frischling

  • »Andreas« ist der Autor dieses Themas

Beiträge: 77

Beruf: Schüler

  • Private Nachricht senden

26

10.02.2008, 10:24

Hi,

Zitat

meinst du es liegt am nebel?
funktioniert es wenn du den nebel ausmachst?

Ich glaube schon das es am Nebel liegt , ich hatte den Nebel einmal ausgeschaltet, da konnte man die Ebene wieder sehen. Zudem kann man die Ebene sehen, wenn man FogEnd und FogStart auf sehr große Werte setzt.
Dann ist aber immer die ganze Ebene gleich betroffen und nicht am Anfang viel und am Ende weniger.

Zitat

was ist für ein textureaddressmode eingestellt!?

Da muss ich zugeben weiß ich nicht was du meinst, die Textur wird genauso wie in dem abgedruckten Code geladen.

Zitat

haben die verwendeten texturen alle abmessungen die eine potenz von 2 sind?


Es handelt sich dabei nur um das Bild Ebene.jpg, welches auch in Daten.zip oder Daten(1).zip oder Daten(3).zip zufinden ist. Diese Textur hat eine Abmessung von 512*512.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

27

10.02.2008, 12:00

Zitat von »"Andreas"«

Ich glaube schon das es am Nebel liegt , ich hatte den Nebel einmal ausgeschaltet, da konnte man die Ebene wieder sehen. Zudem kann man die Ebene sehen, wenn man FogEnd und FogStart auf sehr große Werte setzt.
Dann ist aber immer die ganze Ebene gleich betroffen und nicht am Anfang viel und am Ende weniger.


Hm, ok. Könnte vielleicht daran liegen, dass du Vertex Fog benutzt. Bei Dieser Art von Nebel wird die Nebelfarbe nämlich nur an jedem Vertex bestimmt und dann über das Dreieck interpoliert. Wenn die Vertices sehr weit auseinanderliegen (was der Fall ist, sollte deine Ebene z.B. nur aus zwei Dreiecken bestehen), dann bekommen alle Vertices die Farbe von entsprechend weit entfernten Punkten zugewiesen...

Schau mal ob mit Pixel (Table) Fog immer noch das gleiche Problem auftritt ;)

Andreas

Frischling

  • »Andreas« ist der Autor dieses Themas

Beiträge: 77

Beruf: Schüler

  • Private Nachricht senden

28

10.02.2008, 14:23

Das meinte ich ja damit :

Zitat

Bei euch tritt der Fehler doch auf und hier ist der Quellcode, könntet ihr nicht einmal mit ein paar Nebeleinstellungen (wahrscheinlich dann Pixelnebel) rumspielen und mir dann sagen was funktioniert hat (außer FogEnd und FogStart auf sehr große Werte zu setzen), das wäre echt nett!!!
;)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

29

10.02.2008, 16:00

problem: ich kann nicht, da ich keine tribase engine hab ;)
was ist denn so schwer dran, mal auf pixelnebel zu stellen!?
oder hast du schon? wenn ja, hats was geändert!?

Andreas

Frischling

  • »Andreas« ist der Autor dieses Themas

Beiträge: 77

Beruf: Schüler

  • Private Nachricht senden

30

10.02.2008, 16:09

Tja, mein erstes Problem ist, dass auf meinem Rechner ja alles normal läuft, d.h. auf dem kann ich schonmal nicht testen.
Auf den anderen Rechner hatte ich heute morgen keinen Zugriff, das kann ich jetzt aber gleich ncohmal versuchen...

Werbeanzeige