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

04.06.2017, 18:24

[GELÖST] GetVertex und SetVertex - Problem

Hallo,

ich habe ein Problem mit den Funktionen GetVertex und SetVertex. Ich wollte, einen Vertex-Shader "simulieren". Ich weiß nicht, wie man das sonst nennen könnte, wenn man im Programm die Koordinaten der Vertices eines Modells verändert.

Hier mein 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
// ******************************************************************
// Vertex-Struktur
struct SVertex
{
    tbVector3           vPosition;  // Position
    tbVector3           vNormal;    // Normalenvektor
    tbVector2           vTexture;   // 2D-Texturkoordinaten
    static DWORD        dwFVF;      // Vertexformat
};´
const DWORD SVertex::dwFVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1;

// ******************************************************************
// Simuliert einen Shader
tbResult SimulateShader()
{
    SVertex Vertex;

    for (unsigned int i = 0; i < g_pModel->GetVertexBuffer()->GetMaxVertices(); i++)
    {
        g_pModel->GetVertexBuffer()->GetVertex(i, &Vertex);

        // Position verändern
        Vertex.vPosition += tbVector3(((sinf(Vertex.vPosition.x * 0.2f + g_fTime * 3.0f) * cosf(Vertex.vPosition.z * 0.2f + g_fTime * 3.0f)) * sinf(g_fTime + Vertex.vPosition.x * 0.1f + Vertex.vPosition.z * 0.1f) * 2.0f + sinf(g_fTime) * 0.5f),
                                      ((sinf(Vertex.vPosition.x * 0.2f + g_fTime * 3.0f) * cosf(Vertex.vPosition.z * 0.2f + g_fTime * 3.0f)) * sinf(g_fTime + Vertex.vPosition.x * 0.1f + Vertex.vPosition.z * 0.1f) * 2.0f + sinf(g_fTime) * 0.5f),
                                      ((sinf(Vertex.vPosition.x * 0.2f + g_fTime * 3.0f) * cosf(Vertex.vPosition.z * 0.2f + g_fTime * 3.0f)) * sinf(g_fTime + Vertex.vPosition.x * 0.1f + Vertex.vPosition.z * 0.1f) * 2.0f + sinf(g_fTime) * 0.5f));

        g_pModel->GetVertexBuffer()->SetVertex(i, &Vertex);
    }

    return TB_OK;
}


g_pModel wurde davor schon initalisiert.

Jedoch sieht man nichts davon, dass sich irgendetwas an den Vertices ändert. Und beim Schließen des Programmes, bekomme ich einen NullPointer beim entladen des VertexBuffers.

Ich hoffe mir kann jemand helfen
Grüße Patrick.
Albert Einstein sagte: "2 Stunden mit einem netten Mädchen fühlen sich an wie 20 Minuten, 20 Minuten auf einem heißen Ofen fühlen sich an wie 2 Stunden. - Das ist Relativität"

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Patrick Z.« (06.06.2017, 12:13)


ByteJunkie

Alter Hase

Beiträge: 891

Wohnort: Deutschland

Beruf: Softwareentwickler

  • Private Nachricht senden

2

04.06.2017, 18:41

Hey Patrick,

schau Dir doch im Beispielprogramm 01 die Datei tbDirect3D.cpp an. Da wird so etwas ähnliches gemacht. Mir hat dieses Beispiel sehr geholfen.

Ist aber nicht die schnellste Methode! ;)

Grüße
Mach was Du nicht lassen kannst und lass was Du nicht machen kannst. ;)

3

04.06.2017, 18:58

Ich habe mir das Beispiel jetzt nochmal angeschaut. Jetzt bewegen sich die Verartices auch, aber der NullPointer ist trotzdem vorhanden.

Außerdem bleiben die Vertices nicht verbunden. Also, wie schaffe ich es, dass sich das Objekt nicht in all seine Dreiecke zerlegt?
Albert Einstein sagte: "2 Stunden mit einem netten Mädchen fühlen sich an wie 20 Minuten, 20 Minuten auf einem heißen Ofen fühlen sich an wie 2 Stunden. - Das ist Relativität"

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Patrick Z.« (04.06.2017, 19:18)


ByteJunkie

Alter Hase

Beiträge: 891

Wohnort: Deutschland

Beruf: Softwareentwickler

  • Private Nachricht senden

4

04.06.2017, 20:11

Hey Patrick,

fang mit einem Quadrat aus 2 Dreiecken an und schau was sich verändert. So hab ich das immer gemacht, wenn etwas nicht so funktionierte, wie ich mir das vorgestellt habe.

Das mit dem NullPointer hatte ich am Anfang auch öfters, aber ich kann mich nicht mehr erinnern wo das war. Hast Du vielleicht irgendwo den Index überschritten?

Da hilft nur der Debugger. ;)
Mach was Du nicht lassen kannst und lass was Du nicht machen kannst. ;)

5

04.06.2017, 20:13

Dynamic vertex buffer?

CentuCore

Frischling

Beiträge: 43

Wohnort: Wien

  • Private Nachricht senden

6

05.06.2017, 01:06

Soweit ich das richtig in Erinnerung hab speichert jeder tbVertexBuffer eine Kopie vom eigtl. Vertexbuffer im RAM.
Mit Get-/SetVertex() greifst du dann nur auf die lokale Kopie zu.
Du musst dann noch irgendeine Update Funktion aufrufen die die Änderungen auf die GPU lädt.
KA wie die heißt.

7

05.06.2017, 09:45

Das habe ich eh schon ausgebessert.
Mein derzeitges Problem ist, dass die einzelnen Dreiecke nicht verbunden bleiben. Aber ich glaube, das liegt daran, dass das im tbModel standardmäßig D3DPT_TRIANGLELIST als PrimitivenTyp verwendet wird. Bei D3DPT_TRIANGLESTRIP würde es das Problem nicht geben.
Wegen d NullPointer, mache ich mich auf die Suche.
Albert Einstein sagte: "2 Stunden mit einem netten Mädchen fühlen sich an wie 20 Minuten, 20 Minuten auf einem heißen Ofen fühlen sich an wie 2 Stunden. - Das ist Relativität"

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

8

05.06.2017, 11:24

Korrigier mich wenn ich Quatsch erzähle aber ist es nicht so dass eine Triangle List komplette Dreiecke haben möchte? Das Heißt pro Dreieck auch 3 Punkte? Das würde bedeuten dass du für ein Quadrat 6 Punkte angeben müsstest. Bei einem Triangle Strip wären es nur 4. Möglicherweise gibt es dein Null Pointer Problem weil du zwei Dreiecke aus einer Triangle List mit zu wenigen Daten rendern möchtest? Eine reine Vermutung ins Blaue.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

05.06.2017, 11:59

Mein derzeitges Problem ist, dass die einzelnen Dreiecke nicht verbunden bleiben. Aber ich glaube, das liegt daran, dass das im tbModel standardmäßig D3DPT_TRIANGLELIST als PrimitivenTyp verwendet wird
Das liegt wohl eher daran, dass dein "Shader" die Eckpunkte nicht einheitlich verschiebt. Wenn zwei Dreiecke denselben Vertex teilen, aber der Punkt dupliziert ist (TRIANGLELIST), dann müssen auch beide identisch verschoben werden. Das tust du scheinbar nicht. Vertices zu transformieren ist jedenfalls erstmal unabhängig davon, ob man sie als Strip zeichnet oder nicht.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

05.06.2017, 14:52

Das liegt wohl eher daran, dass dein "Shader" die Eckpunkte nicht einheitlich verschiebt.

Der "Shader", wie er hier gezeigt ist, macht die Verschiebung nur abhängig von der Position des Vertex und der globalen Zeitvariable, nicht von der Schleifenvariable o.Ä.
@Patrick: Hast du den "Shader" geändert?

Werbeanzeige