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

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

31

23.12.2011, 21:37

Nein. Das heißt nur, dass Du kein Backup brauchst. Du renderst den Ausgangszustand einfach in eine Textur, dann den Zielzustand ebenfalls in eine Textur und diese Texturen renderst Du dann mit Transparenz in den Backbuffer. Ich dachte, dass das mittlerweile klar gewesen wäre.
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]

ProAmateur

Alter Hase

  • »ProAmateur« ist der Autor dieses Themas

Beiträge: 434

Wohnort: Bei Simmern, Koblenz

Beruf: Schüler

  • Private Nachricht senden

32

24.12.2011, 07:17

Ja das hab ich ja auch schon lang verstanden!!!
Die frage is ja nur, Wenn ich meine textur als render buffer setze,
Wie Mann ich danach wieder in den backbuffer rendert, weil ich ja vorher an dessen stelle
Den render-target gesetzt habe?
Ich brauche ja um den wieder zu seten irgendein zeiger oder was auch immer....woher bekomm ich das?
"Die Neugier steht immer an erster Stelle eines Problems, das gelöst werden will."
Galileo Galilei
________________________________________________________________________

"Dumme Fragen gibt es nicht, dumm ist nur, wer nicht fragt.“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

33

24.12.2011, 08:19

Frag die Doku Deiner API.
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]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

34

24.12.2011, 10:26

Na du rufst einfach SetRenderTarget() mit dem BackBuffer auf!?

FSA

Community-Fossil

  • Private Nachricht senden

35

24.12.2011, 11:17

@dot: Warum muss er GetBackBuffer aufrufen? Kann er nicht einfach den Surface aus dem BackBuffer lesen und mit SetRenderTarget wieder den BackBuffer Surface setzen?

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

36

24.12.2011, 12:20

Ja kann er auch. Aber anstatt in jedem Frame GetRenderTarget() aufzurufen, ist es wohl schlauer, sich einfach einmal den BackBuffer zu holen...

ProAmateur

Alter Hase

  • »ProAmateur« ist der Autor dieses Themas

Beiträge: 434

Wohnort: Bei Simmern, Koblenz

Beruf: Schüler

  • Private Nachricht senden

37

27.12.2011, 12:17

Also ich hab den Code jetzt darum erweitert:

Im Menü funktioniert es, dass ich in die textur rendere.
ABER im game nicht!

Die Modelle, so vwie die Schrift werden nicht angezeigt, nur eine kleine Animation, die ich über ransformierte Vertice rendern.

Ich hab jez das Gefühl, dass es daran liegt, dass ich zuerst die Modelle "normal" rendere und danach die textur in welche ich reingerendert habe, über transformierte Vertices.

Hier der Code, die Render() vom game-zustand:

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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
// __________________________________________________________________
// Rendert den Spielzustand
tbResult CGame::Render(float fTime)
{
    tbMatrix    mCamera;
    tbMatrix    mProjection;
    D3DLIGHT9   CamLight;

    // Puffer leeren und Szene beginnen
    tbDirect3D& D3D = tbDirect3D::Instance();

    D3D->SetRenderTarget (0, g_pBillard->m_pRenderTargetSurfaceGame);

    D3D->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, tbColor(0.5f, 0.5f, 0.0f), 1.0f, 0);
    D3D->BeginScene();

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

    // Kameramatrix erstellen und aktivieren
    mCamera = tbMatrixCamera(m_vCameraPos, tbVector3(0,0,0));
    D3D.SetTransform(D3DTS_VIEW, mCamera);

    // Projektionsmatrix erstellen und aktivieren
    mProjection = tbMatrixProjection(TB_DEG_TO_RAD(70.0f),
                                     D3D.GetAspect(),
                                     0.1f, 500.0f);
    D3D.SetTransform(D3DTS_PROJECTION, mProjection);

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

    // Richtungslicht mit der Richtung der Kamera erstellen und aktivieren
    ZeroMemory(&CamLight, sizeof(D3DLIGHT9));

    CamLight.Type           = D3DLIGHT_POINT;                               // Punktlicht
    CamLight.Diffuse        = tbColor(1.5f, 1.4f, 1.45f);                   // Weiße Streufarbe
    CamLight.Ambient        = tbColor(1.0f, 1.0f, 1.0f);                    // Weiße Hintergrundfarbe
    CamLight.Specular       = tbColor(1.0f, 1.0f, 1.0f);                    // Weiße Glanzfarbe
    CamLight.Position       = tbVector3(0.0f,1.0f, 0.0f);   // Variierende Position
    CamLight.Range          = 1000.0f;                                      // 1000 Einheiten Reichweite
    CamLight.Attenuation0   = 0.0f;                                         // Lichtabschwächung
    CamLight.Attenuation1   = 0.0005f;                                      // ...
    CamLight.Attenuation2   = 0.0f; 
    
    D3D->SetLight(0, &CamLight);
    D3D->LightEnable(0, TRUE);// ...

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

    // SchwacheHintergrundbeleuchtung
    D3D.SetRS(D3DRS_AMBIENT, tbColor(5.3f, 3.2f, 4.56f));

    // ------------------------------------------------------------------
    // Rendern
    D3D.SetRS (D3DRS_ZENABLE, TRUE);

    D3D.SetTransform(D3DTS_WORLD, tbMatrixScaling(15) * tbMatrixRotationY(TB_DEG_TO_RAD(90.0f)) * tbMatrixTranslation(tbVector3(0,-25,0)));
    m_pKneipenModel->Render();

    D3D.SetTransform(D3DTS_WORLD, tbMatrixTranslation(tbVector3(0,-1,0)));
    m_pLevelModel->Render();

    D3D.SetTransform(D3DTS_WORLD, tbMatrixScaling(tbVector3(10,5,5)) * tbMatrixTranslation(tbVector3(0,0,0)));
    m_pHelpLineModel->Render(-1,-1,0,0);

    m_Queue->Render();

    // Bälle rendern
    for (int x=0; x<16; x++) m_Ball[x]->Render ();

    D3D.SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1);
    D3D.SetRS(D3DRS_ZENABLE, D3DZB_FALSE);

    // Balken zeichnen
    D3D->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, m_aVertex, sizeof(STransformVertex));

    g_pBillard->m_pFont2->Begin();
    // Wenn das Spiel pausiert, wird "Pause" in der Bildmitte angezeigt.
    if(m_bPaused)
    {
        g_pBillard->m_pFont2->DrawText(tbVector2(0.5f, 0.5f), "Pause",
                                          TB_FF_ALIGN_HCENTER | TB_FF_ALIGN_VCENTER | TB_FF_RELATIVE | TB_FF_RELATIVESCALING, -1, tbColor(1.0f, 1.0f, 1.0f), tbColor(1.0f, 1.0f, 1.0f), tbVector2(1.5f, 1.5f));
    }

    char name[50];
    sprintf (name, "%s            %i", m_Round%2 == 0 ? "Spieler 1" : "Spieler 2", m_Player[m_Round%2]->m_Counter);
    // Spieler Anzeige
    g_pBillard->m_pFont2->DrawText(tbVector2(0.7f, 0.1f), name,
                                          TB_FF_ALIGN_HCENTER | TB_FF_ALIGN_VCENTER | TB_FF_RELATIVE | TB_FF_RELATIVESCALING, -1, tbColor(1.0f, 1.0f, 1.0f), tbColor(1.0f, 1.0f, 1.0f), tbVector2(1.5f, 1.5f));
    
    sprintf (name, "%s", m_Player[m_Round%2]->m_bColor == E_VOLL ? "Voll" : "Halb");
    // Spieler Anzeige
    g_pBillard->m_pFont2->DrawText(tbVector2(0.2f, 0.1f), name,
                                          TB_FF_ALIGN_HCENTER | TB_FF_ALIGN_VCENTER | TB_FF_RELATIVE | TB_FF_RELATIVESCALING, -1, tbColor(1.0f, 1.0f, 1.0f), tbColor(1.0f, 1.0f, 1.0f), tbVector2(1.5f, 1.5f));
    

    if (m_bFoul[1])
    {
        m_fFoulTime = 2;
        m_bFoul[1] = false;
    }

    m_fFoulTime -= fTime;

    if (m_fFoulTime > 0.0f)
    {
        
        g_pBillard->m_pFont2->DrawText(tbVector2(0.5f, 0.4f), "FOUL",
                                          TB_FF_ALIGN_HCENTER | TB_FF_ALIGN_VCENTER | TB_FF_RELATIVE | TB_FF_RELATIVESCALING, -1, tbColor(1.0f, 1.0f, 1.0f), tbColor(1.0f, 1.0f, 1.0f), tbVector2(1.5f, 1.5f));
    }

    if (m_bGameOver)
    {
        g_pBillard->m_pFont2->DrawText(tbVector2(0.5f, 0.4f), (m_Round+1)%2 == 0 ? "Spieler 1 Siegt" : "Spieler 2 Siegt",
                                          TB_FF_ALIGN_HCENTER | TB_FF_ALIGN_VCENTER | TB_FF_RELATIVE | TB_FF_RELATIVESCALING, -1, tbColor(1.0f, 1.0f, 1.0f), tbColor(1.0f, 1.0f, 1.0f), tbVector2(1.5f, 1.5f));
    }
    g_pBillard->m_pFont2->End();

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

    IDirect3DSurface9* pBackBuffer = NULL;

     /*get pointer to back buffer*/
    D3D->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO, &pBackBuffer);

    D3D->SetRenderTarget (0, pBackBuffer); 

    D3D->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, tbColor(0.0f, 0.0f, 0.0f), 1.0f, 0);

    D3D.SetTexture (0, g_pBillard->m_pRenderTargetGame);


    D3D.SetRS(D3DRS_ZENABLE, D3DZB_FALSE);

    m_aVertex[0].vTex0 = tbVector2(0.0f, 1.0f);
    m_aVertex[1].vTex0 = tbVector2(0.0f, 0.0f);
    m_aVertex[2].vTex0 = tbVector2(1.0f, 1.0f);
    m_aVertex[3].vTex0 = tbVector2(1.0f, 0.0f);

    D3D->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, m_aVertex, sizeof(STransformVertex));


    // Szene beenden
    D3D->EndScene();

    return TB_OK;
}


Hab ich dabei irgebndetwas vergessen?
"Die Neugier steht immer an erster Stelle eines Problems, das gelöst werden will."
Galileo Galilei
________________________________________________________________________

"Dumme Fragen gibt es nicht, dumm ist nur, wer nicht fragt.“

Werbeanzeige