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

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

1

07.01.2012, 20:53

LockRect: InvalidCall!

Hallo. Ich suche nun schon ewig den Fehler, aber bekomme ihn nicht raus. Mein Problem ist, dass ich bei der TriBase Engine einfach aus Spaß ein schwarzen Kreis mit tbDraw2D in eine Textur "malen" wollte.
Ich render in den Backbuffer, anschließen frage ich ihn bzw die Oberfläche mit GetRenderTarget ab. Dann kopiere ich den Inhalt in meine Texturoberfläche:

C-/C++-Quelltext

1
2
GetRenderTarget(0,&pBackBuffer);
StretchRect(pBackBuffer,NULL,pRenderSurface,NULL,D3DTEXF_NONE);

Ich setze den Rendertarget nirgendswo neu. Danach beginne ich wieder die Szene und möchte gerne ein Kreis in die Textur / bzw deren Oberfläche rendern:

C-/C++-Quelltext

1
2
3
4
_2DHandler->m_pSurface = pRenderSurface;
_2DHandler->BeginDraw();
_2DHandler->DrawFilledCircle(100, 100, 20, _2DHandler->MakeRGB(0,0,0) );
_2DHandler->EndDraw();

Dann render ich die Textur in die ich malen wollte. Nun dazu kommt es nicht den das Programm stürtzt ab.
Ich bekomme ein Fehler bei _2DHandler->BeginDraw, und zwar da wo die Tribase Engine LockRect aufruft. Ich kriege nur ein InavlidCall von DirectX.
Meine Textur erstelle ich so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
CreateTexture(GetScreenSize().x,
                                GetScreenSize().y,
                                1,
                                D3DUSAGE_RENDERTARGET,
                                D3DFMT_X8R8G8B8,
                                D3DPOOL_DEFAULT,
                                &pRenderTexture,
                                NULL);

pRenderTexture->GetSurfaceLevel( 0, &pRenderSurface );

Den "2D Drawer" initialisiere ich so:

C-/C++-Quelltext

1
2
_2DHandler = new tbDraw2D;
    if(_2DHandler->Init(pRenderTexture,0)) Beep(200,200);

Dort kommt kein Fehler.
Ich bin Dankbar für jede Hilfe.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

2

07.01.2012, 21:01

Zitat von »dot«

Texturen im D3DPOOL_DEFAULT kann man nicht locken

Aus diesem Thread entnommen. ;)

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

3

07.01.2012, 21:11

Danke. Ich habe jetzt D3DPOOL_MANAGED genommen und bekomme jetzt ein InvalidCall beim ertsellen der Textur :( Wie lässt sich das lösen?
EDIT: D3DPOOL_SYSTEMMEM geht auch nicht :( Gleicher Fehler->InvalidCall

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »FSA« (07.01.2012, 21:19)


FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

4

07.01.2012, 21:59

Wieso kann ich die Textur nicht so erstellen?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
CreateTexture(GetScreenSize().x,
                                GetScreenSize().y,
                                1,
                                D3DUSAGE_RENDERTARGET,
                                D3DFMT_X8R8G8B8,
                                D3DPOOL_MANAGED,
                                &pRenderTexture,
                                NULL);

Ich komm einfach nicht weiter :S

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

5

07.01.2012, 22:30

Das Problem dabei ist, dass du ein RenderTarget erstellen willst.
Dazu brauch die Grafikkarte direkten Zugang zur Textur, also im VRAM (Default Pool).
Mehr dazu hier.

Was du machen müsstest ist die Textur irgendwie in eine andere Textur, die im Systemspeicher liegt, zu kopieren und dann diese zu locken.
Leider habe ich lange nichts mehr mit D3D9 gemacht und weiß leider nicht mehr wie das ging.
Stöbere einfach mal in der Doku rum. So mache ich es meistens auch :)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

07.01.2012, 23:26

Warum genau willst du das Rendertarget locken?
Abgesehen davon: http://msdn.microsoft.com/en-us/library/…p/bb174405.aspx

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

7

08.01.2012, 14:05

Nein, ich möchte nicht das Rendertarget sperren. Ich render in eine Textur so wie du es gesagt hast ;) So nun wollte ich die Textur der Tribase Engine übergeben damit ich ein Kreis "reinmalen" kann. Ich habe es jetzt schon soweit das kein InvalidCall mehr kommt allerdings auch kein Kreis :/
Mein Code:
In Load

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
CreateTexture(GetScreenSize().x,
                                GetScreenSize().y,
                                1,
                                D3DUSAGE_RENDERTARGET,
                                D3DFMT_X8R8G8B8,
                                D3DPOOL_DEFAULT,
                                &pRenderTexture,
                                NULL);
pRenderTexture->GetSurfaceLevel( 0, &pRenderSurface );

    CreateTexture(GetScreenSize().x,
                                GetScreenSize().y,
                                1,
                                0,
                                D3DFMT_X8R8G8B8,
                                D3DPOOL_SYSTEMMEM,
                                &pCopyTex,
                                NULL);

//...

_2DHandler = new tbDraw2D;
    if(_2DHandler->Init(pCopyTex,0)) Beep(200,200);

Es kommt nirgends ein Fehler.
In der render Funktion mache ich das:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
//...
GetRenderTarget(0,&pBackBuffer);
StretchRect(pBackBuffer,NULL,pRenderSurface,NULL,D3DTEXF_NONE);
UpdateTexture(pRenderTexture, pCopyTex);
//... Szene beginnen
_2DHandler->Init(pCopyTex,0);
_2DHandler->BeginDraw();
_2DHandler->DrawFilledCircle(100, 100, 20, _2DHandler->MakeRGB(0,0,0) );
_2DHandler->EndDraw();
//... SetTexture(pCopyTex) und Tetxur Rendern

Also pCopyTex wir gerendert alles geht wunderbar, nur ich sehe kein Kreis auf der Textur. Es kommt auch kein Fehler :/ Danke für jede Hilfe.

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

8

08.01.2012, 14:13

Wieso kannst du deinen Kreis nicht einfach direkt in das Rendertarget rendern!?

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

9

08.01.2012, 14:17

Wie genau sollte ich das mit der TriBase realiesieren? Mir geht es ja darum mit der Tribase das zu schaffen und nicht selbst zu Rendern ;)

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

10

08.01.2012, 14:22

Da ich die TriBase nicht wirklich kenne, kann ich dir das leider nicht verraten. Nur wenn das da oben tut, was ich vermute, dass es tut, nämlich das Rendertarget locken und mit der CPU reinmalen, dann ist das wohl nicht so besonders performant...

Werbeanzeige