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?