Primitives (2D) auf eine Textur zeichnen
-
hi ihr,
Ich schreibe zur Zeit eine kleine Engine, mit 2d, 3d, sound, musik, netzwerk, usw. Zur Zeit schreibe ich an der 2d komponente, diese besteht bereits aus dem Graphics system (wird später auch für 3d benutzt) und einer textur klasse (auch für 3d). außerdem noch einer 2d vertex struktur (x, y, z, rhw, color)
^Das nur mal so als hintergrund, meine frage: Ich möchte jetzt primitives (pixel, lines, rects und ovals, später vielleicht noch mehr... :-)) direkt auf meine textur zeichnen können. die methoden zum zeichnen dieser primitives habe ich in die Graphics klasse gesteckt, die textur klasse hat einen zeiger auf diese klasse, sie erzeigen die vertices und zeichnen sie dann per drawprimitive..
freage: Wie rendere ich jetzt die primitives direkt auf die Textur?
(ach ja, meine "eigentliche" textur, nicht die klasse, ist natürlich eine IDirect3DTexture8 Texture, was dann auch die frage nach der API beantworten dürfte). Bitte helft mir, danke schon mal.
-
indem du die textur, bzw eine surface davon, als rendertarget setzt, dann kannst du alles was du sonst auf den screen zeichnen würdest auch auf die textur pinseln.
rapso->greets();
-
und wie mache ich das (code meine ich...)
und dann stellt sich mir die frage: wie seze ich dann später den backbuffer wieder als render target???
danke
-
Hi,
hier mal exemplarisch:
D3DXCreateTexture(d3ddevice, Screenwidth, Screenheight, 0, D3DUSAGE_RENDERTARGET, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &FrontTex ); FrontTex->GetSurfaceLevel(0, &FrontSurf); d3ddevice->SetRenderTarget(FrontSurf, NULL);
Du erstellt ein leere Texture, holst die dir Surface 0 davon, und setzt es als Rendertarget des Device. Wenn du dann wieder Normal rendern willstm dann setzt du als Rendertarget wieder deb Backbuffer, den du am anfang einmal geholt hast und der auch eine Surface darstellt.
d3ddevice->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &BackBuffer);
d3ddevice->SetRenderTarget(BackBuffer, NULL);
-
Aber wenn ich die textur aöls render target erstelle, kann ich dann denn noch was damit anfangen? (ich meine blitten oder auf meshes legen)
-
Aber wenn ich die textur aöls render target erstelle, kann ich dann denn noch was damit anfangen? (ich meine blitten oder auf meshes legen)
Natürlich. es bleibt immer noch ne Textur. Die kannst du auch wie alle anderen normalen Texturen benutzen. Wär ja sonst sinnlos.
-
stimmt
gut, werde das mal probieren,
-
Muss man irgendwas beachten , wenn man einen Vertex/Pixelshader nimmt.
Ohne den Shader funktioniert es, ich kann auf meine Textur rendern.
Nur mit dem Shader geht es nicht.
-
BlackWolf schrieb:
Muss man irgendwas beachten , wenn man einen Vertex/Pixelshader nimmt.
Ohne den Shader funktioniert es, ich kann auf meine Textur rendern.
Nur mit dem Shader geht es nicht.poste doch mal deine pixel und vertexshader und vielleicht noch was du gegenüber der vertexshaderlosen variante geändert hast, dann können wir dir eher helfen.
zudem wäre es nützlich zu sehen wie du den vertexbuffer anlegst, wenn du ihn mit D3DFVF_XYZRHW erstellst erstellst, dann wird kein vertexshader benutzt soweit ich weiß, wenn du dahinter dann nen pixelshader hast, könnte es also nicht die erwarteten resultate geben.
rapso->greets();
-
Ich frag nochmal: Warum nicht einfach ohne Shader rendern?
Bye, TGGC (Reden wie die Großen)
-
Hier der Code:
********************************************** D3DXCreateTexture(lpD3DDevice, 256, 256, 0, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &textur); lpD3DDevice->BeginScene(); //tex_rendern lpD3DDevice->SetTexture(0, NULL); lpD3DDevice->SetRenderTarget( 0, rendersurface ); lpD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1.0f, 0); tex_rendern(objekte); //back_rendern lpD3DDevice->SetRenderTarget( 0, lpDDSBack ); lpD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1.0f, 0); back_rendern(objekte); ********************************** const char BaseVShader[] = "vs.1.1 \n"\ "dcl_position0 v0 \n"\ "dcl_normal0 v3 \n"\ "dcl_texcoord0 v6 \n"\ "m4x4 oPos, v0, c0 \n"\ "mov oD0, c5 \n"\ "dp3 oD1, v3, -c12 \n"\ "mov oT0, v6 \n"; const char BasePShader[] = "ps.1.1 \n"\ "tex t0 \n"\ "add r0, v0, v1 \n"\ "mul r0, r0, t0 \n";
//by rapso
Ich hoffe das langt, ist ein ganz einfacher Shader, aber zum Testen langt er.Ich kann mit dem Shader rendern, nur nicht in eine Textur.
Ohne Shader kann ich dafür in eine Textur rendern.Ich benutze .x-Files als Objekte.
-
Sch*** Cut&Paste, hab was vergessen.
lpD3DDevice->BeginScene(); //tex_rendern lpD3DDevice->SetTexture(0, NULL); textur->GetSurfaceLevel(0, &rendersurface); lpD3DDevice->SetRenderTarget( 0, rendersurface );
//by rapso
Der Rest ist wie oben.
-
welches format hat der vertexbuffer?
rapso->greets();