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

Gotbread

Alter Hase

  • »Gotbread« ist der Autor dieses Themas

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

1

24.06.2009, 21:55

render to texture anzeigefehler

Hallo

ich habe einen kleinen roten würfel der sich dreht. ganz normale einstellungen
ohne shader, etc...

diesen würfel rendere ich in einer textur und klatsche die dann mit einem
fullscreenquad auf den screen.

das angezeigte bild entspricht jedoch überhaupt nicht der gerenderten textur.
zwecks debugging habe ich die textur mal abgespeichert -> sieht normal
aus, wie erwartet.
jetzt habe ich die textur mal von diesem bild geladen statt neu zu rendern.
-> sieht normal aus. nur wenn ich das gerenderte bild direkt verwenden
will klappts nicht.

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
// dev = device-klasse

// t1 = textur (RENDERTARGET | DEFAULTPOOL)

// 

while (window->ProcessMessages())
{
    dev->BeginScene();

    IDirect3DSurface9 *pold, *pnew;

    dev->GetDevice()->GetRenderTarget(0, &pold);
    t1->GetTexture()->GetSurfaceLevel(0, &pnew);
    dev->GetDevice()->SetRenderTarget(0, pnew);

    dev->Clear();

    dev->GetSceneManager()->Render(0.f);

    dev->GetDevice()->SetRenderTarget(0, pold);
    pold->Release();
    pnew->Release();

    //D3DXSaveTextureToFile("top.bmp", D3DXIFF_BMP, t1->GetTexture(), 0);


    const float offset = -0.5f;
    typedef VertexStructure<true, true, false, false>::Type vertex;
    vertex vertices[4];

    vertices[0].x = 0.f;
    vertices[0].y = 0.f;
    vertices[0].u = 0.f;
    vertices[0].v = 0.f;

    vertices[1].x = 1.f;
    vertices[1].y = 0.f;
    vertices[1].u = 1.f;
    vertices[1].v = 0.f;

    vertices[2].x = 0.f;
    vertices[2].y = 1.f;
    vertices[2].u = 0.f;
    vertices[2].v = 1.f;

    vertices[3].x = 1.f;
    vertices[3].y = 1.f;
    vertices[3].u = 1.f;
    vertices[3].v = 1.f;

    for (unsigned i = 0; i < 4; ++i)
    {
        vertices[i].x *= static_cast<float>(dev->GetWidth());
            vertices[i].x += offset;
        vertices[i].y *= static_cast<float>(dev->GetHeight());
        vertices[i].y += offset;
    }

    dev->SetFVF(vertex::fvf);
    dev->SetTexture(t1);
    dev->Draw(DrawFlags::Trianglestrip, 2, vertices, sizeof(vertex));
    dev->ResetFVF();

    dev->EndScene();
    dev->Present();
}


enthällt zum teil engine-funktionen, die aber funktionieren einwandfrei.
(kapselung von textur und renderdevice)

die gerenderte und abgespeicherte textur:

klick

und das Present() ergebnis

klick
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

2

25.06.2009, 07:58

Sieht nach falschen Texturkoordinaten aus.
vertices[1] und vertices[2] vertauscht?
fka tm

Gotbread

Alter Hase

  • »Gotbread« ist der Autor dieses Themas

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

3

25.06.2009, 18:35

die koordinaten sind schon richtig, sonst würde die tex nicht richtig angezeigt, wenn ich
sie aus der datei lade
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

25.06.2009, 20:04

Löscht du auch den z-Buffer? Wie sehen deine vertices aus, wie dein FVF?

Btw: Das mit dem offset um -0.5 Pixel musst du für die Texturkoordinaten machen und nicht für die Position ;)

Gotbread

Alter Hase

  • »Gotbread« ist der Autor dieses Themas

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

5

25.06.2009, 20:59

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
struct vertex
{
    vertex() : rhw(1.f), z(0.f){}
    float x, y, z;
    float rhw;
    float u, v;
    static const unsigned fvf = D3DFVF_XYZRHW | D3DFVF_TEX1;
};
// ...........




// den zbuffer löschen

dev->Clear(0, RenderDevice::ClearZBuffer);


// und die vertices

vertices[0].x = 0.f;
vertices[0].y = 0.f;
vertices[0].u = 0.f;
vertices[0].v = 0.f;

vertices[1].x = 1.f;
vertices[1].y = 0.f;
vertices[1].u = 1.f;
vertices[1].v = 0.f;

vertices[2].x = 0.f;
vertices[2].y = 1.f;
vertices[2].u = 0.f;
vertices[2].v = 1.f;

vertices[3].x = 1.f;
vertices[3].y = 1.f;
vertices[3].u = 1.f;
vertices[3].v = 1.f;

for (unsigned i = 0; i < 4; ++i)
{
    vertices[i].x *= static_cast<float>(dev->GetWidth());
    vertices[i].x += offset;
    vertices[i].y *= static_cast<float>(dev->GetHeight());
    vertices[i].y += offset;
}


am ende multiplizier ich das ganze noch mit der breite und höhe des
backbuffers (sieht schöner aus als in der deklaration)

Zitat von »"dot"«


Btw: Das mit dem offset um -0.5 Pixel musst du für die Texturkoordinaten machen und nicht für die Position


wenn ich aber die texturkoordinaten um 0.5 verschiebe, hab ich nur
das untere viertel (texcoord geht von 0 bis 1)

siehe auch die MSDN-Referenz, die das ganze gut erklärt.

Zitat von »"MSDN-Referenz (ganz unten)"«


C-/C++-Quelltext

1
2
3
4
5
6
//adjust all the vertices to correctly line up texels with pixels 

for (int i=0; i<6; i++)
{
    vertices[i].x -= 0.5f;
    vertices[i].y -= 0.5f;
}

Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

Werbeanzeige