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.09.2004, 12:52

Schwarzes Bild beim Rendern

Hi Leute, cih hab ein kleinens Problem in meiner Render funktion, ich möchte ein Bild als Hintergrund rendern, und anchließend ein Schwarzes Viereck drüber legen (mit Zeitabhängigem Alphawert) um einen Blendeffekt zu simmulieren.
Aus irgendeinem Grund bekomm cih aber nur ein schwarzes Bild beim Rendern (obwohl die Color werte mittlerweile auf Weiß stehen)....
Wenn ich das zeichnen des Vierecks weglasse, wir das Hintergrundbild ohne Probleme dargestellt....

Der Fehler muss also bei dem Viereck liegen, kann mir irgendwer helfen? Hab ich vielleciht irgendwelche Einstellungen für Alphablending vergessen?
Vielen Dank
Nils

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
//Rendert den Spielzustand

tbResult CIntro::Render(float fTime)
{
    STitleVertex aVertex[4];
    STitle2Vertex aVertex2[4];


    // Puffer leeren und Szene beginnen

    tbDirect3D::Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
                      tbColor(0.0f, 0.0f, 0.0f), 1.0f, 0);
    tbDirect3D::BeginScene();

    // ------------------------------------------------------------------


    // Vertexformat und Titelbildtextur setzen, Z-Buffer aus

    tbDirect3D::SetFVF(TITLE_FVF);
    tbDirect3D::SetTexture(0, g_pImpact->m_pTitle);
    tbDirect3D::SetRS(D3DRS_ZENABLE, D3DZB_TRUE);

    // Die vier Vertizes des Titelbilds erstellen (Rechteck)

    // Links unten

    aVertex[0].vPosition = tbVector3(-15.0f, tbDirect3D::GetScreenSize().y + 15.0f, 0.5f);
    aVertex[0].fRHW = 1.0f;
    aVertex[0].Color = tbColor(1.0f, 1.0f, 1.0f);
    aVertex[0].vTex0 = tbVector2(0.0f, 1.0f);

    // Links oben

    aVertex[1].vPosition = tbVector3(-15.0f, -15.0f, 0.5f);
    aVertex[1].fRHW = 1.0f;
    aVertex[1].Color = tbColor(1.0f, 1.0f, 1.0f);
    aVertex[1].vTex0 = tbVector2(0.0f, 0.0f);

    // Rechts unten

    aVertex[2].vPosition = tbVector3(tbDirect3D::GetScreenSize().x + 15.0f, tbDirect3D::GetScreenSize().y+ 15.0f, 0.5f);
    aVertex[2].fRHW = 1.0f;
    aVertex[2].Color = tbColor(1.0f, 1.0f, 1.0f);
    aVertex[2].vTex0 = tbVector2(1.0f, 1.0f);

    // Rechts oben

    aVertex[3].vPosition = tbVector3(tbDirect3D::GetScreenSize().x+ 15.0f, -15.0f, 0.5f);
    aVertex[3].fRHW = 1.0f;
    aVertex[3].Color = tbColor(1.0f, 1.0f, 1.0f);
    aVertex[3].vTex0 = tbVector2(1.0f, 0.0f);

    // Texturkoordinaten sinusförmig verschieben ("wabbeln")

    for(DWORD dwVertex = 0; dwVertex < 4; dwVertex++)
    {
        aVertex[dwVertex].vTex0.x += sinf(g_pImpact->m_fTime + (float)(dwVertex)) * 0.01f;
        aVertex[dwVertex].vTex0.y += cosf(g_pImpact->m_fTime + (float)(dwVertex)) * 0.01f;
    }

    // Als Dreiecksfolge zeichnen

    tbDirect3D::GetDevice()->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, aVertex, sizeof(STitleVertex));


    // Einblend Effekt mit schwarzem Rechteck realisieren


    // Vertexformat und Titelbildtextur setzen, Z-Buffer aus

    tbDirect3D::SetFVF(TITLE2_FVF);

    // Die vier Vertizes des Abdunkelbildes erstellen (Rechteck)

    // Links unten

    aVertex2[0].vPosition = tbVector3(0.0f, tbDirect3D::GetScreenSize().y, 0.4f);
    aVertex2[0].fRHW = 1.0f;
    aVertex2[0].Color = tbColor(1.0f, 1.0f, 1.0f,g_pImpact->m_fTime);

    // Links oben

    aVertex2[1].vPosition = tbVector3(0.0f, 0.0f, 0.4f);
    aVertex2[1].fRHW = 1.0f;
    aVertex2[1].Color = tbColor(1.0f, 1.0f, 1.0f,g_pImpact->m_fTime);

    // Rechts unten

    aVertex2[2].vPosition = tbVector3(tbDirect3D::GetScreenSize().x, tbDirect3D::GetScreenSize().y, 0.5f);
    aVertex2[2].fRHW = 1.0f;
    aVertex2[2].Color = tbColor(1.0f, 1.0f, 1.0f,g_pImpact->m_fTime);

    // Rechts oben

    aVertex2[3].vPosition = tbVector3(tbDirect3D::GetScreenSize().x, 0.0f, 0.5f);
    aVertex2[3].fRHW = 1.0f;
    aVertex2[3].Color = tbColor(1.0f, 1.0f, 1.0f,g_pImpact->m_fTime);

    //Das ganze zeichnen

    tbDirect3D::GetDevice()->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, aVertex2, sizeof(STitle2Vertex));

    // Szene beenden

    tbDirect3D::EndScene();

    return TB_OK;
}

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

2

04.09.2004, 13:18

Schwarzes Bild?

Mach mal als hintergrundfarbe diese hier und nicht schwarz: 0xFFEAEAEA

Wenn du nun etwas siehst, ist dein Objekt nicht beleuchtet. Ansonsten suchen gucken wa mal :)

3

04.09.2004, 13:55

Ja hab das mal ausprobiert, aber das hat ncihts geholfen, und die Belecuhtung müsste doch ohnehin aus sein, da das ja standadbei directx ist und ich sie vorher nirgends eingestellt hab. (Hab sie dennoch jetzt mal ausgestellt) bringt auch nix

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

4

04.09.2004, 15:21

standardmäßig ist bei DX Licht an bei OpenGL ist es aus.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

04.09.2004, 18:31

standardmäßig ist bei DirectX alphablending aus...
wie wärs also mit einschalten, ich kann nirgendwo in deinem code erkennen, dass das passiert!?

außerdem solltest du zum zeichnen vertexbuffer verwenden...

6

04.09.2004, 23:21

Hast du auch tbDirect3D::Present() aufgerufen?
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

7

05.09.2004, 20:22

@dot: wie stell ich es ein? aber sollte es dann ncith zum9indest das eine viereck korrekt zeichnen und nciht einfahc dne bildschirm leer lassen...

vertexbuffer: ja gut, bei 4 dreiecken die gezeichnet werden (im intro) lohnt sich der aufwand echt nciht

@dragon master: ja hab ich, geschiet ausserhalb der funktion

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

05.09.2004, 22:27

versuchs mal so:

C-/C++-Quelltext

1
2
3
4
pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, true );
pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
pDevice->SetRenderState( D3DRS_BLENDOP, D3DBLENDOP_ADD );

9

06.09.2004, 20:59

Okay, vielen Dank für eure hilfe, auch wenn ncihts davon geholfen hat ;-)

Hab soeben den Fehler entdeckt, man muss natürlich SetTexture(0,NULL) aufrufen, ansonsten versucht er ja mit der Textur zu rendern statt mit der Vertexfarbe, und da es keine Texturkoordinaten gibt bleibt alles schwarz.....
Mfg Nils

Werbeanzeige