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

09.03.2009, 21:04

R2VB - DrawPrimitive schlägt fehl

Hallo

ich habe endlich eine möglichkeit gefunden, ein GPU-Partikelsystem zu
entwickeln, undd zwar mit dem netten ATI-Feature R2VB (Render to Vertex
Buffer).

Dabei bin ich genau wie in diesem Beispiel vorgegangen, meine Karte
unterstützt das Feature definitiv, und alle Befehle funktionen auch
(S_OK), nur DrawPrimitive streikt mit -2005530516 oder 0x8876086C.
Dazu finde ich leider keine beschreibung außer FAIL...

code: (gekürtzt)

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
// INIT:


HRESULT hr = dev->GetDirect3D()->CheckDeviceFormat(cfg.Adapter, cfg.DevType, cfg.BackBufferFormat, 0, D3DRTYPE_SURFACE,
        (D3DFORMAT)MAKEFOURCC('R','2','V','B')); // S_OK


CreateTexture(D3DFMT_A32B32G32R32F, D3DPOOL_DEFAULT, DMAP + RENDERTARGET); // S_OK 16 * 16 pixel

// SYSTEMMEM textur mit selben einstellungen erzeugen S_OK


// default-textur mit systemmem texture updaten S_OK

// dummy vertexbuffer erzeugen, 4 * float * 16 * 16 // S_OK


// die default textur funktionert, kann auf ein dreieck gespannt werden!


// RENDERING:


BeginScene();
HRESULT hr;
    hr = dev->GetDevice()->SetRenderState(D3DRS_POINTSIZE, r2vbGlbEnable_Set(TRUE));
    hr = dev->GetDevice()->SetTexture(D3DDMAPSAMPLER, t->GetTexture()); // t->GetTexture() ribt die richtige textur an !

    hr = dev->GetDevice()->SetRenderState(D3DRS_POINTSIZE, r2vbVStrm2SmpMap_Set(1, R2VB_VSMP_OVR_DMAP));
    hr = dev->GetDevice()->SetStreamSource(1, dummy->GetVertexBuffer(), 0, 4 * sizeof(float));

FVF_XYZ + FVF_DIFFUSE setzen S_OK
// bis hier S_OK


hr = dev->GetDevice()->DrawPrimitive(D3DPT_POINTLIST, 0, 16 * 16);


Wenn ich den Dummy-Vertexbuffer fülle und zeichne funktionert der call,
nur mit der textur klappt das nicht.

Die Textur wird mit lauter "1.f" werten per float-pointer beschrieben.
Das Format [x y z color] sollte also genau durch [A R G B] gefüllt werden.

tut es aber nicht :(

Wo ist der Fehler?
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

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

Gotbread

Alter Hase

  • »Gotbread« ist der Autor dieses Themas

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

2

10.03.2009, 16:03

:)

gelöst, habe vergessen die vertexdeklaration statt dem FVF zu sezten

C-/C++-Quelltext

1
2
3
4
5
6
7
D3DVERTEXELEMENT9 elem[] =
{
    {1, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
    {1, 12, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0},
    D3DDECL_END()
};
dev->GetDevice()->CreateVertexDeclaration(elem, &decl);


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

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