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

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

1

18.02.2012, 21:26

Volume Texture

Hallo. Ich habe ein Problem. Ich will eine VolumeTexture rendern lassen. Dazu habe ich das Beispiel vom Hauseigenen Buch, also mit TriBase Engine und CO, verwendet. Eine Volumentextur von 32 Ebenen lässt sich rendern. Jedoch nicht von 64 Ebenen. Zwar kommt das Programm in die Renderfunktion und löscht den BackBuffer, aber es wird kein Bild gerendert. In der Log steht nichts und der Debugger hat auch nichts zu melden. :crazy:
Der Code ist wie aus dem Buch.
Danke im Voraus. :thumbsup:

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

18.02.2012, 22:13

Debug Runtime?
Pix?
Wie genau renderst du?
Wie wärs mit etwas Code?

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

3

18.02.2012, 23:45

DebugRuntime: Nichts
Pix: Alles S_OK
Code:

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
    HRESULT hResult;
    SVertex aVertex[4];


    // Den Bildpuffer leeren
    if(FAILED(hResult = g_pD3DDevice->Clear(0,
                                            NULL,
                                            D3DCLEAR_TARGET,
                                            D3DCOLOR_XRGB(0, 0, 63),
                                            1.0f,
                                            0)))
    {
        // Fehler beim Leeren!
        TB_ERROR_DIRECTX("g_pD3DDevice->Clear", hResult, TB_STOP);
    }

    // Szene beginnen
    g_pD3DDevice->BeginScene();

    // Das Viereck erstellen, auf dem die Animation abgespielt wird.
    // Die w-Texturkoordinate bestimmt dabei, wie weit die Animation fortgeschritten ist.
    // Zwischen 0 und 1 wird sie genau einmal abgespielt, hinter 1 wiederholt sie sich.
    aVertex[0].vPosition = tbVector3(-1.0f, -1.0f, 1.0f);
    aVertex[1].vPosition = tbVector3(-1.0f,  1.0f, 1.0f);
    aVertex[2].vPosition = tbVector3( 1.0f, -1.0f, 1.0f);
    aVertex[3].vPosition = tbVector3( 1.0f,  1.0f, 1.0f);
    aVertex[0].vTexture = tbVector3(0.0f, 1.0f, g_fTime * 0.1f);
    aVertex[1].vTexture = tbVector3(0.0f, 0.0f, g_fTime * 0.1f);
    aVertex[2].vTexture = tbVector3(1.0f, 1.0f, g_fTime * 0.1f);
    aVertex[3].vTexture = tbVector3(1.0f, 0.0f, g_fTime * 0.1f);

    // Nun das Viereck als Dreiecksfolge zeichnen (so brauchen wir nur 4 Vertizes)
    if(FAILED(hResult = g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,
                                                      2,
                                                      aVertex,
                                                      sizeof(SVertex))))
    {
        // Fehler beim Zeichnen!
        TB_ERROR_DIRECTX("g_pD3DDevice->DrawPrimitiveUP", hResult, TB_ERROR);
    }

    // Szene beenden
    g_pD3DDevice->EndScene();

    // Der große Moment: den Bildpuffer sichtbar machen
    g_pD3DDevice->Present(NULL, NULL, NULL, NULL);

Init:

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
HRESULT     hResult;
    tbMatrix    mProjection;
    float       fAspect;


    // Vertexformat setzen - Positions-, Farb- und Texturkoordinatenangabe
    if(FAILED(hResult = g_pD3DDevice->SetFVF(SVertex::dwFVF)))
    {
        // Fehler beim Setzen des Vertexformats!
        TB_ERROR_DIRECTX("g_pD3DDevice->SetFVF", hResult, TB_ERROR);
    }

    // Beleuchtung und Z-Buffering ausschalten, Dithering aktivieren
    g_pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
    g_pD3DDevice->SetRenderState(D3DRS_ZENABLE, FALSE);
    g_pD3DDevice->SetRenderState(D3DRS_DITHERENABLE, TRUE);

    // Alpha-Blending einschalten, so dass die Quellfarbe zur Transparenzberechnung
    // verwendet wird.
    g_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
    g_pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCCOLOR);
    g_pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCCOLOR);

    // Bilineare Texturfilter
    g_pD3DDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
    g_pD3DDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);

    // Das Bildseitenverhältnis berechnen
    fAspect =   (float)(g_Direct3DParameters.VideoMode.Width)
              / (float)(g_Direct3DParameters.VideoMode.Height);

    // Die Projektionsmatrix erzeugen
    mProjection = tbMatrixProjection(TB_DEG_TO_RAD(90.0f),  // Sichtfeld: 90°
                                     fAspect,               // Bildseitenverhältnis
                                     0.1f,                  // Nahe Clipping-Ebene
                                     100.0f);               // Ferne Clipping-Ebene

    // Projektionsmatrix einsetzen
    g_pD3DDevice->SetTransform(D3DTS_PROJECTION, (D3DMATRIX*)(&mProjection));

    // Die Textur ohne MIP-Maps laden
    if(FAILED(hResult = D3DXCreateVolumeTextureFromFileEx(g_pD3DDevice,     // Device
                                                          "Explosion.dds",  // Dateiname
                                                          D3DX_DEFAULT,     // Breite
                                                          D3DX_DEFAULT,     // Tiefe
                                                          D3DX_DEFAULT,     // Höhe
                                                          1,                // MIP-Maps
                                                          0,                // Verwendungszweck
                                                          D3DFMT_UNKNOWN,   // Format
                                                          D3DPOOL_MANAGED,  // Speicherklasse
                                                          D3DX_FILTER_NONE, // Filter
                                                          D3DX_DEFAULT,     // MIP-Map-Filter
                                                          0,                // Color-Key
                                                          NULL,             // Unwichtig
                                                          NULL,             // Unwichtig
                                                          &g_pTexture)))    // Die Textur
    {
        // Fehler! Wahrscheinlich werden keine Volumentexturen unterstützt.
        MessageBox(g_hWindow, "Die Volumentextur konnte nicht erstellt werden!\nWahrscheinlich werden Volumentexturen von Ihrer Hardware nicht unterstützt.\nSchalten Sie auf den Referenz-Rasterizer um!",
                   "Fehler", MB_OK | MB_ICONEXCLAMATION);
        TB_ERROR_DIRECTX("D3DXCreateVolumeTextureFromFileEx", hResult, TB_ERROR);
    }

    // Und nun die Textur einsetzen
    g_pD3DDevice->SetTexture(0, g_pTexture);

(TriBase Engine)
Danke.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

19.02.2012, 00:09

Pix: Alles S_OK

Der Sinn von Pix ist nicht, die Rückgabewerte zu checken. Pix ist ein Direct3D Debugger ;)

Pix kann dir z.B. die Frage beantworten, ob das Quad überhaupt auf dem Bildschirm landet. Nicht dass du irgendeine komische World Matrix gesetzt hast ;)

Sind denn in der Textur auch wirklich die richtigen Daten?
Mich wundert dass die kleinere Textur funktioniert, müsstest du nicht eigentlich irgendwo 3D Texturkoordinaten aktivieren?
Stimmt dein FVF?
Stimmen die Texcoords?
Wie sieht's mit dem Blending aus, hat die Textur vielleicht nen Alphakanal von 0?
Was für ein Format hat die Textur eigentlich überhaupt?

Btw: D3DRS_DITHERENABLE kannst du dir sparen, 1980 haben wir hinter uns ;)

Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von »dot« (19.02.2012, 00:18)


5

19.02.2012, 11:36

Ist die Textur vielleicht einfach zu groß? Welche Auflösung hat die denn?
Lieber dumm fragen, als dumm bleiben!

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

6

19.02.2012, 12:20

Ja in der Textur sind richtige Daten.
3D Texturekooridinaten sind aktiviert.
FvF ist OK.
Texcoords sind auch richtig.
Ich habe im Texturetool kein Alphabild hinzugefügt. Soll Ich das machen?
DDS
@Jonathan_Klein 1366x768so wie mein anderer Bildschirm. Die TExtur ist 302MB groß.
Danke

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

19.02.2012, 12:31

Ich meinte natürlich das Surface Format. Wenn es A8R8G8B8 ist und du keinen Alphakanal angegeben hast, vielleicht ist der irgendwo entlang des Weges zu 0 geworden?

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

8

19.02.2012, 12:53

Nein habe ichauch schon geguckt. Also ich vermute das die Textur einfach zu groß ist. :( Ich wollte die als ersatz für ein Video rendern. Das geht aber leider nicht. Und Videos abspielen das ist mir etwas kompliziert ^^
ABer dennoch Danke.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

19.02.2012, 13:07

Deine Textur braucht wahrscheinlich Breite, Höhe und Tiefe, die Zweierpotenzen sind.

Außerdem ist es eine sehr schlechte Idee, Videos in Form von Volumentexturen zu speichern. Mehr als ein paar Frames kriegst du da nicht rein, weil die Daten ohne Kompression (MPEG etc.) viel zu groß sind.

Werbeanzeige