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

05.11.2009, 21:56

Terrain rendern

hi @ all,

wollte mich ma an heightmaps wagen. habs an sich soweit hinbekommen ein gelände mit ner heightmap zu machen, aber leider sieht die nicht so aus, wie ich es mir vorgestellt habe.

am besten beschreibt mein problem ein screenshot

http://img692.imageshack.us/img692/7079/screenshoto.jpg

ich möchte jetzt noch keinen quellcode veröffentlichen, da ich erstmal nur durch eure ansätze das problem beheben möchte.

-ich habe noch nichts texturiert o.ä.
-licht habe ich deaktiviert

danke schonmal für antworten

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

05.11.2009, 22:00

Das Problem ist doch ganz eindeutig: Du hast irgendwo ein Fehler gemacht... :!:

3

05.11.2009, 22:01

Es gibt ungefähr eine Millionen Heighmaptutorials im Netz. Da du keine konkrete Frage stellst, solltest du die einfach mal lesen.
Das Bild sieht natürlich falsch aus, aber ich finde es albern da jetzt nach der Ursache zu raten, solange du keinen Code zeigst.

Evtl. solltest du auch das hier lesen:
http://www.lugbz.org/documents/smart-questions_de.html
Lieber dumm fragen, als dumm bleiben!

4

05.11.2009, 22:10

ich hab kein problem damit, quellcode zu zeigen, nur ist es wahrscheinlich wieder nur ein banaler fehler.

hier der quellcode:

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
void C_MYGE_Terrain::init(LPDIRECT3DDEVICE9 lpDevice, const char *lpHeightMap)
{
    HRESULT hr;
    int i, j, k;

    this->m_lpD3DDevice = lpDevice;

    LPDIRECT3DSURFACE9 lpSurface;

    D3DXIMAGE_INFO ImgInfo;

    D3DXGetImageInfoFromFile(lpHeightMap, &ImgInfo);

    m_Width = ImgInfo.Width;
    m_Height = ImgInfo.Height;

    if(FAILED(hr = this->m_lpD3DDevice->CreateOffscreenPlainSurface(m_Width,
                                                     m_Height,
                                                     D3DFMT_L8,
                                                     D3DPOOL_SCRATCH,
                                                     &lpSurface, 0)))
    {
        this->writeDirectXError("m_lpD3DDevice->CreateOffscreenPlainSurface", hr);
        MessageBox(NULL, "Fehler beim Anlegen der Oberfläche", "Fehler", MB_ICONERROR);
        exit(0);
    }

    D3DXLoadSurfaceFromFile(lpSurface, 0, 0, lpHeightMap, 0, D3DX_DEFAULT, 0, 0);

    int SizeVertices = m_Width * m_Height;
    int SizeIndices = (m_Width-1)*(m_Height-1)*2*3;

    if(FAILED(hr = this->m_lpD3DDevice->CreateVertexBuffer(SizeVertices*sizeof(TERRAIN_VERTEX), 0, D3DFVF_TERRAINVERTEX, D3DPOOL_DEFAULT, &m_lpVB, 0)))
    {
        this->writeDirectXError("m_lpD3DDevice->CreateVertexBuffer", hr);
        MessageBox(NULL, "Fehler beim Anlegen des Vertexbuffers", "Fehler", MB_ICONERROR);
        exit(0);
    }
    
    if(FAILED(hr = this->m_lpD3DDevice->CreateIndexBuffer(SizeIndices * 2, 0, D3DFMT_INDEX16, D3DPOOL_MANAGED, &m_lpIB, 0)))
    {
        this->writeDirectXError("m_lpD3DDevice->CreateIndexBuffer", hr);
        MessageBox(NULL, "Fehler beim Anlegen des Indexbuffers", "Fehler", MB_ICONERROR);
        exit(0);
    }

    D3DLOCKED_RECT LockedRect;
    if(FAILED(hr = lpSurface->LockRect(&LockedRect, 0, 0)))
    {
        this->writeDirectXError("lpSurface->LockRect", hr);
        MessageBox(NULL, "Fehler beim sperren der Oberfläche", "Fehler", MB_ICONERROR);
        exit(0);
    }

    BYTE* lpHeights = static_cast<BYTE*>(LockedRect.pBits);

    int nPitch = LockedRect.Pitch;

    TERRAIN_VERTEX* vertices = new TERRAIN_VERTEX[SizeVertices];

    for(i = 0; i < m_Height; i++)
    {
        for(j = 0; j < m_Width; j++)
        {
            vertices[i*m_Width+j].x = j;
            vertices[i*m_Width+j].y = lpHeights[i*nPitch+j];
            vertices[i*m_Width+j].z = (m_Height - i);

            vertices[i*m_Width+j].Color = D3DCOLOR_XRGB(lpHeights[i*m_Width+j],
                                                        lpHeights[i*m_Width+j],
                                                        lpHeights[i*m_Width+j]);
        }
        short* Indices = new short[SizeIndices];
        k = 0;
        for(i = 0; i < m_Height-1; i++)
        {
            for(j=0; j < m_Width-1; j++)
            {
                Indices[k++] = m_Width * i + 1 + j;
                Indices[k++] = m_Width * i +j;
                Indices[k++] = m_Width * i + 1 + j + 1;

                Indices[k++] = m_Width * i + j;
                Indices[k++] = m_Width * i + j + 1;
                Indices[k++] = m_Width * i + 1 + j + 1;
            }
        }

        void* pVertices;

        m_lpVB->Lock(0, SizeVertices*sizeof(TERRAIN_VERTEX), (void**)& pVertices, 0);

        memcpy(pVertices, vertices, SizeVertices*sizeof(TERRAIN_VERTEX));

        m_lpVB->Unlock();

        void* pIndices;

        m_lpIB->Lock(0, SizeIndices * sizeof(int), reinterpret_cast<void**>(&pIndices), 0);

        memcpy(pIndices, Indices, SizeIndices*sizeof(short));

        m_lpIB->Unlock();

        delete[] vertices;
        delete[] Indices;

        lpSurface->Release();
    }

}


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
void C_MYGE_Terrain::render()
{
    m_lpD3DDevice->SetFVF(D3DFVF_TERRAINVERTEX);

    m_lpD3DDevice->SetStreamSource(0, m_lpVB, 0, sizeof(TERRAIN_VERTEX));

    m_lpD3DDevice->SetIndices(m_lpIB);

    m_lpD3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, m_Height * m_Width, 0, (m_Width - 1) * (m_Height-1)*2);
}


so sieht die init methode vor der nachrichtenschleife aus:

C-/C++-Quelltext

1
2
3
4
5
Terrain.init(Direct3D.getDevice(), "E:\\MYGE\\Debug\\HeightMap\\Heightmap.jpg");

    Direct3D.getDevice()->SetRenderState(D3DRS_LIGHTING, false);
    Direct3D.getDevice()->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
    .Direct3D.getDevice()->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);




C-/C++-Quelltext

1
2
3
4
5
6
7
Direct3D.createCamera(D3DXVECTOR3(50.0f, 20.0f, fCamPosY), D3DXVECTOR3(0.0f, 10.0f, 20.0f));

    Direct3D.BeginScene(D3DCOLOR_XRGB(0, 0, 0));

    Terrain.render();

    Direct3D.EndScene();

5

06.11.2009, 00:51

C-/C++-Quelltext

1
Direct3D.getDevice()->SetRenderState(D3DRS_CULLMODE, D3DCULL_CWW);

anstatt:

C-/C++-Quelltext

1
Direct3D.getDevice()->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);


Wenn ich mich jetzt nicht täusche, ordnest du die Vertices gegen den Uhrzeigersinn an, aber D3DCULL_CW ist im Uhrzeigersinn.

6

06.11.2009, 15:19

Schalt vielleicht mal Beleuchtung und Culling ganz ab.

7

09.11.2009, 09:56

habs mit cullmode ccw und none probiert, immer das selbe ergebnis. hab die beleuchtung aktiviert, aber das einzige, was sich geändert hat, war die farbe der umrisse des terrains von weis auf schwarz. am WE habe ich auch keine zeit gefunden, um mir die init methode des terrains nochmal anzuschauen. ich vermute, dass da das problem liegt und nicht bei den renderstates.

8

09.11.2009, 14:09

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
    for(i = 0; i < m_Height; i++)
    [b]{[/b]
        for(j = 0; j < m_Width; j++)
      [b] {[/b]
            vertices[i*m_Width+j].x = j;
            vertices[i*m_Width+j].y = lpHeights[i*nPitch+j];
            vertices[i*m_Width+j].z = (m_Height - i);

            vertices[i*m_Width+j].Color = D3DCOLOR_XRGB(lpHeights[i*m_Width+j],
                                                        lpHeights[i*m_Width+j],
                                                        lpHeights[i*m_Width+j]);
        [b]}[/b]
        short* Indices = new short[SizeIndices];
        k = 0;
        for(i = 0; i < m_Height-1; i++)
        [b]{[/b]
            for(j=0; j < m_Width-1; j++)
           [b] {[/b]
                Indices[k++] = m_Width * i + 1 + j;
                Indices[k++] = m_Width * i +j;
                Indices[k++] = m_Width * i + 1 + j + 1;

                Indices[k++] = m_Width * i + j;
                Indices[k++] = m_Width * i + j + 1;
                Indices[k++] = m_Width * i + 1 + j + 1;
           [b] }[/b]
        [b]}[/b]

        void* pVertices;

        m_lpVB->Lock(0, SizeVertices*sizeof(TERRAIN_VERTEX), (void**)& pVertices, 0);

        memcpy(pVertices, vertices, SizeVertices*sizeof(TERRAIN_VERTEX));

        m_lpVB->Unlock();

        void* pIndices;

        m_lpIB->Lock(0, SizeIndices * sizeof(int), reinterpret_cast<void**>(&pIndices), 0);

        memcpy(pIndices, Indices, SizeIndices*sizeof(short));

        m_lpIB->Unlock();

        delete[] vertices;
        delete[] Indices;

        lpSurface->Release();
    [b]}[/b] 


Täusch ich mich, oder löscht du in der For-Schleife jedes mal das Surface ?
Da ist ja alles mit Freigeben in der Schleife drinne.

EDIT: Kann man das ""-Tag nicht verwenden im cpp Tag ?

Werbeanzeige