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

20.05.2010, 19:31

Simples Texturrendering

Hi @all,

ich habe da ein Problem, welches fast schon zu einfach ist, um es zu posten, aber ich tus trotzdem, da ich nicht mehr weiter weis.

Ich habe zum Testen ein Modell mithilfe der TriBase-Engine geladen, was auch perfekt funktioniert. Jetzt habe ich gedacht, ich probiere mal ein einfaches Rechteck in die 3D-Welt zu rendern, auf das ich ne Textur klatsche. Soll sowas wie ein 3D-"Datenblatt" des Raumschiffmodells werden.

Mein Problem ist folgendes: Die Textur erscheint nicht. Das Rechteck ist als schwarzer Scheme zu erkennen, aber die Textur fehlt. Im folgenden poste ich den Code, der damit zusammenhängt:

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
// Die Render-Funktion
tbResult RenderProc(float fNumSecsPassed)
{
    tbMatrix    mProjection;
    tbMatrix    mWorld;
    D3DLIGHT9   Light;

    // Z-Buffer leeren und die Szene beginnen
    tbDirect3D& D3D = tbDirect3D::Instance();
    D3D->Clear(0, NULL, D3DCLEAR_ZBUFFER, 0, 1.0f, 0);
    D3D->BeginScene();

    // Projektionsmatrix erstellen und einsetzen
    mProjection = tbMatrixProjection(g_fFOV, D3D.GetAspect(), 0.1f, 5000.0f);
    D3D.SetTransform(D3DTS_PROJECTION, mProjection);

    // Kameramatrix erstellen und einsetzen
    g_pCamera->SetCamera(D3D);

    // Skybox rendern
    g_pSkyBox->Render(g_pCamera->GetPosition());

    // Ein Richtungslicht erstellen
    ZeroMemory(&Light, sizeof(D3DLIGHT9));
    Light.Type = D3DLIGHT_DIRECTIONAL;
    Light.Diffuse = tbColor(1.0f, 1.0f, 1.0f);
    Light.Ambient = tbColor(0.4f, 0.4f, 0.4f);
    Light.Specular = tbColor(1.0f, 1.0f, 1.0f);
    Light.Direction = tbVector3(1.0f, 0, 0);
    D3D->SetLight(0, &Light);
    D3D->LightEnable(0, TRUE);

    // Nebel!
    D3D.SetRS(D3DRS_FOGENABLE,      TRUE);
    D3D.SetRS(D3DRS_FOGVERTEXMODE,  D3DFOG_LINEAR);
    D3D.SetRS(D3DRS_RANGEFOGENABLE, TRUE);
    D3D.SetRS(D3DRS_FOGCOLOR,       0);
    D3D.SetRSF(D3DRS_FOGSTART,      4900.0f);
    D3D.SetRSF(D3DRS_FOGEND,        5000.0f);

    // Weltmatrix zurücksetzen
    D3D.SetTransform(D3DTS_WORLD, tbMatrixIdentity());

    // Schiff rendern
    mWorld = tbMatrixRotationY(g_fTime * -0.5f);
    D3D.SetTransform(D3DTS_WORLD, mWorld);
    g_pModel->Render();

    D3D->LightEnable(0, FALSE);

    // Das Datenblatt rendern
    D3D.SetFVF(SVertex::dwFVF);
    mWorld = tbMatrixTranslation(tbVector3(20, 0, 0));
    D3D.SetTransform(D3DTS_WORLD, mWorld);
    
    D3D.SetTexture(0, g_pTexture);
    D3D->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 1, g_aTriangles[0].aVertex, sizeof(SVertex));
    D3D->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 1, g_aTriangles[1].aVertex, sizeof(SVertex));

    // Kein Nebel mehr!
    D3D.SetRS(D3DRS_FOGENABLE, FALSE);

        // Anzeige von fps und Zeitdauer
    char acText[256];
    sprintf(acText, "Zeit: %.2f\nFPS: %.2f", g_fTime, 1.0f / fNumSecsPassed);
    g_pFont->Begin();
    g_pFont->DrawText(tbVector2(10.0f, 10.0f),
                       acText,                      // Der Text
                       TB_FF_ALIGN_HLEFT,           // Links ausrichten
                       -1,                          // Textlänge automatisch ermitteln
                       tbColor(0.25f, 1.0f, 0.25f), // Startfarbe (links), grün
                       tbColor(1.0f, 1.0f, 1.0f),   // Endfarbe (rechts), weiß
                       tbVector2(0.75f, 1.0f),      // Skalierung (75% auf x-Achse)
                       -2.0f,                       // Zeichen um 2 Pixel enger
                       2.0f,                        // Kursivität: 2 Pixel
                       0.0f,                        // Standardzeilenabstand
                       50.0f,                       // Tab-Stopps alle 50 Pixel
                       0.0f);                       // x-Abstand = 0
    g_pFont->End();

    // Szene beenden
    D3D->EndScene();

    return TB_OK;
}


Hier mein Vertexformat:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct SVertex
{
    tbVector3           vPosition;  // Position des Vertex
    DWORD               dwColor;    // Farbe des Vertex
    tbVector2           vTexture;   // Texturkoordinaten
    static const DWORD  dwFVF;      // Vertexformat
};

const DWORD SVertex::dwFVF = D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1;

// Struktur für ein Dreieck
struct STriangle
{
    tbVector3   vPosition;      // Position
    SVertex     aVertex[3];     // Die drei Vertizes
};

STriangle g_aTriangles[2];


und hier werden die Dreiecke initialisiert und die Textur geladen.

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
g_aTriangles[0].aVertex[0].vPosition = tbVector3(-50, 30, 0);
    g_aTriangles[0].aVertex[0].vTexture = tbVector2(0, 0);
    g_aTriangles[0].aVertex[1].vPosition = tbVector3(50, 30, 0);
    g_aTriangles[0].aVertex[1].vTexture = tbVector2(1, 0);
    g_aTriangles[0].aVertex[2].vPosition = tbVector3(-50, -30, 0);
    g_aTriangles[0].aVertex[2].vTexture = tbVector2(0, 1);
    g_aTriangles[0].aVertex[0].dwColor = tbColor(1.0f, 1.0f, 1.0f);
    g_aTriangles[0].aVertex[1].dwColor = tbColor(1.0f, 1.0f, 1.0f);
    g_aTriangles[0].aVertex[2].dwColor = tbColor(1.0f, 1.0f, 1.0f);

    g_aTriangles[1].aVertex[0].vPosition = tbVector3(50, 30, 0);
    g_aTriangles[1].aVertex[0].vTexture = tbVector2(1, 0);
    g_aTriangles[1].aVertex[1].vPosition = tbVector3(50, -30, 0);
    g_aTriangles[1].aVertex[1].vTexture = tbVector2(1, 1);
    g_aTriangles[1].aVertex[2].vPosition = tbVector3(-50, -30, 0);
    g_aTriangles[1].aVertex[2].vTexture = tbVector2(0, 1);
    g_aTriangles[1].aVertex[0].dwColor = tbColor(1.0f, 1.0f, 1.0f);
    g_aTriangles[1].aVertex[1].dwColor = tbColor(1.0f, 1.0f, 1.0f);
    g_aTriangles[1].aVertex[2].dwColor = tbColor(1.0f, 1.0f, 1.0f);

    g_pTexture = tbTextureManager::Instance().LoadTexture("Data\\wiki.dds");
    if(!g_pTexture) {
        MessageBox(tbDirect3D::Instance().GetWindow(), "Fehler beim Laden des Datenblattes!",
                   "Fehler", MB_OK | MB_ICONEXCLAMATION);
        CleanUp();
        return 1;
    }


Die Textur ist eine .dds, ich habe es aber auch mit gleich bescheidenem Erfolg mit ner .bmp versucht...

Kann jemand einen Fehler erkennen und mich drauf hinweisen?

Danke schonmal im Voraus

Oromis_32

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

20.05.2010, 20:09

Nach kurzem überfliegen tippe ich mal draf dass dein Rechteck keine Normalvektoren hat und deswegen die Beleuchtung immer 0 wird.
Entweder Normalvektoren verpassen (wenn du das Rechteck beleuchtet haben willst) oder beim Rendern des Rechecks die Beleuchtung abschalten (Renderstate D3DRS_LIGHTING auf FALSE setzen).

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (20.05.2010, 20:16)


3

22.05.2010, 11:57

Danke. Ohne Beleuchtung sieht das ganze so aus, wie ich es wollte *thumbsup*

Werbeanzeige

Ähnliche Themen