PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Terrain-Spielerei unter DX9


MeLLe
2004-08-24, 21:28:26
Hallo ihrs ;)

hab ein kleines Problemchen. Eigentlich wollte ich nur "fix mal" eine kleine Terrain-Rendering-Studie betreiben, und mit der Verwendung von Vertex-Buffers klappts auch ganz gut. Nun wollt ich mal sehen, wie das mit Index-Buffers klappt, schon alleine wegen LODing, was ich später dann angedacht habe. Aber selbst der simpelste Code bringt DX zum würgen ...
Schaut her:


Const MAP_SIZE = 1024
Const TILING_TERRAIN = 16
Private iIndexCount As Long = 0
Private vbTerrain As VertexBuffer
Private ibTerrain As IndexBuffer

[...]

Dim X, Z As Long
vbTerrain = New VertexBuffer(GetType(CustomVertex.PositionTextured), MAP_SIZE * MAP_SIZE, D3DDev, 0, CustomVertex.PositionTextured.Format, Pool.Managed)
Dim vTerrain As CustomVertex.PositionTextured() = CType(vbTerrain.Lock(0, 0), CustomVertex.PositionTextured())
For X = 0 To MAP_SIZE - 1
For Z = 0 To MAP_SIZE - 1
vTerrain(X + Z * MAP_SIZE) = New CustomVertex.PositionTextured(X, Height(gHeightMap, X, Z), Z, TILING_TERRAIN * X / (Floor(MAP_SIZE / STEP_SIZE) * STEP_SIZE - STEP_SIZE), TILING_TERRAIN * Z / (Floor(MAP_SIZE / STEP_SIZE) * STEP_SIZE - STEP_SIZE))
Next
Next
vbTerrain.Unlock()

ibTerrain = New IndexBuffer(GetType(Integer), (MAP_SIZE - 1) * (MAP_SIZE - 1) * 2 * 2 * 3, D3DDev, 0, Pool.Managed)
Dim iTerrain As Integer() = CType(ibTerrain.Lock(0, 0), Integer())
For X = 0 To MAP_SIZE - 1 - 1
For Z = 0 To MAP_SIZE - 1 - 1
iTerrain((X + Z * (MAP_SIZE - 1)) * 6) = (X + 1) + (Z + 1) * MAP_SIZE
iTerrain((X + Z * (MAP_SIZE - 1)) * 6 + 1) = (X + 1) + Z * MAP_SIZE
iTerrain((X + Z * (MAP_SIZE - 1)) * 6 + 2) = X + Z * MAP_SIZE

iTerrain((X + Z * (MAP_SIZE - 1)) * 6 + 3) = (X + 1) + (Z + 1) * MAP_SIZE
iTerrain((X + Z * (MAP_SIZE - 1)) * 6 + 4) = X + Z * MAP_SIZE
iTerrain((X + Z * (MAP_SIZE - 1)) * 6 + 5) = X + (Z + 1) * MAP_SIZE
iIndexCount += 6
Next
Next
ibTerrain.Unlock()

[...]

D3DDev.SetStreamSource(0, vbTerrain, 0)
D3DDev.VertexFormat = CustomVertex.PositionTextured.Format
D3DDev.Indices = ibTerrain
D3DDev.SetTexture(0, texTerrain)
D3DDev.Transform.World = matTerrain
D3DDev.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, MAP_SIZE * MAP_SIZE, 0, iIndexCount / 3)

Und genau in der letzten Zeile steigt die Anwendung mit einem "unknown error" aus.

Warum?

pajofego
2004-08-24, 21:54:00
Wennn ich mich nicht ganz irre hast du zu viele Primitives. Solltes die Anzahl deiner Primitives über m_d3dcaps.MaxPrimitiveCount abfragen, aber schau mal hier Terrain Thread (http://www.forum-3dcenter.org/vbulletin/showthread.php?t=156982&highlight=pajofego) hatte nämlich dieses Problem. Vielleicht liegt es ja daran.

MeLLe
2004-08-24, 22:46:02
Wennn ich mich nicht ganz irre hast du zu viele Primitives. Solltes die Anzahl deiner Primitives über m_d3dcaps.MaxPrimitiveCount abfragen, aber schau mal hier Terrain Thread (http://www.forum-3dcenter.org/vbulletin/showthread.php?t=156982&highlight=pajofego) hatte nämlich dieses Problem. Vielleicht liegt es ja daran.
Klingt gut - probier ich gleich mal aus! ;)
Danke!

MeLLe
2004-08-25, 06:38:10
Wennn ich mich nicht ganz irre hast du zu viele Primitives. Solltes die Anzahl deiner Primitives über m_d3dcaps.MaxPrimitiveCount abfragen, aber schau mal hier Terrain Thread (http://www.forum-3dcenter.org/vbulletin/showthread.php?t=156982&highlight=pajofego) hatte nämlich dieses Problem. Vielleicht liegt es ja daran.
Stell dir vor - hat sogar geklappt, das ganze ;)
Allerdings hab ich nun noch ne Art "degenerate Triangles" in meinem fertigen Rendering - da sind noch paar Indices verrutscht, denk ich mir mal ...

MeLLe
2004-08-30, 15:06:36
Ein Problem gelöst - schon folgt das nächste...

Eine zeitlang ging die Sache ja gut. Nun hab ich ne Wasserfläche eingebaut, diie genau so hoch wie das Terrain tesseliert ist. Und das Terrain ist inzwischen ein zufällig erzeugtes.
Beide Teile rendere ich über je ein Paar aus Vertex- und Index-Buffer. Damit ich nicht über das MaxPrimitiveCount-Limit komme, geschieht die so:

iBatchSize = iMaxPrimitives
iBatchCount = Floor(iNumOfPolygons / iBatchSize)
iLastBatch = iNumOfPolygons - iBatchCount * iBatchSize

[...]

Device.SetStreamSource(0, vbTerrain, 0, VertexInformation.GetFormatSize(CustomVertex.PositionColored.Format))
Device.VertexFormat = CustomVertex.PositionColored.Format
Device.Indices = ibTerrain
For i = 0 To iBatchCount - 1
Device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, iBatchSize * 3, i * iBatchSize, iBatchSize)
Next
Device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, iLastBatch * 3, iBatchCount * iBatchSize, iLastBatch)


Bei Device.Present() steigt DX jedoch aus, selbst wenn ich's auf den RefRast schicke.
Wie kann das sein?

micki
2004-08-31, 00:23:31
was zeigt der dx debug output denn an?

MfG
micki

MeLLe
2004-08-31, 07:54:32
Gar nix ;D

Das einzige was ich zu sehen bekomme ist das Bildchen hier im Anhang ...

Demirug
2004-08-31, 12:16:30
Bist du sicher das dein Device Object noch in Ordnung ist?

Dieser Fehler deutet nämlich darauf hin das du irgendwo ein Object freigegeben hast das noch gebraucht wird.

MeLLe
2004-09-01, 07:50:15
Bist du sicher das dein Device Object noch in Ordnung ist?
Dieser Fehler deutet nämlich darauf hin das du irgendwo ein Object freigegeben hast das noch gebraucht wird.
Laut Debugger im Einzelschritt ist bis zu Device.Present() mein Device vollkommen intakt - das ist es ja was ich so komisch finde.
Inzwischen habe ich aber herausgefunden, dass die Treiber und/oder Hardware einen Teil des Problems ausmachen - zu Hause auf meiner Gf4Ti läuft die Sache nämlich per HAL-Device ohne Probleme, hier auf Arbeit auf der Mobility R7500 läufts aber nur wenn ich keine Indexbuffer verwende. Das geht aber auch erst seit ich gestern den Cat4.8 installiert habe - vorher stieg mir die VPU schon bevor überhaupt ein Frame gerendert wurde aus, genau wie jetzt mit Indexbuffers, und VPU-Recover erwies sich als extrem nützliches Feature ...

Demi, hast du VB.net zur Hand? Wenn ja würd ich - sofern das ok ist - dir mein Projekt mal schicken, einfach zum überfliegen. Ist ja net groß ;-)