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

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

11

17.06.2010, 14:40

Wenn ich folgendes schreibe kommt der Fehlercode "GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT":

C-/C++-Quelltext

1
2
3
4
5
6
7
8
glTexImage2D(
    GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, Width, Height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, 0
);

glGenFramebuffersEXT(1, &FrameBufferID);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, FrameBufferID);

glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, DepthTexID, 0);

Die Texture wird zumindest richtig erstellt. Denn wenn ich mit "glCopyTexSubImage2D" arbeite, habe ich endlich mal eine Teifen Texture.
Aber ich will das natürlich mit RenderTargets bzw. FrameBufferObjects machen.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

12

17.06.2010, 14:44

Dein Framebuffer hat ja auch nur nen DepthBuffer und keinen ColorBuffer. Wenn du da also reinrendern willst musst du natürlich vorher mit glDrawBuffer(GL_NONE) das rendern in den ColorBuffer abschalten...

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

13

17.06.2010, 14:52

AHHHH!!!! :D
Das muss mir aber auch erst mal einer sagen ^^.
Ich hatte mir heute zum ersten Mal die Funktion "glDrawBuffer" in der OpenGL 2.1 Reference Page angesehen und konnte damit aber noch nicht sooo viel anfangen.
Ich dachte die Funktion gilt für den Pixel Buffer und nicht für den FrameBuffer.
Also muss ich das immer ein- oder ausschalten, je nach dem ob ich gerade eine Color oder Depth Texture verwenden will?!

Danke für deine Hilfe :)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

14

17.06.2010, 15:08

Also muss ich das immer ein- oder ausschalten, je nach dem ob ich gerade eine Color oder Depth Texture verwenden will?!

Nein das musst du eben dann aus- und einschalten wenn du nur in eine DepthTexture rendern willst. Also eben genau dann wenn du keinen ColorBuffer hast...

Btw: Ich rate jetzt und sag einfach mal: Für Shadow Mapping ist es evtl. sowieso besser keine DepthTexture zu verwenden sondern eine normale Float Texture und dann statt der Clipspace die Viewspace Depth zu verwenden (über Fragment Shader in die Textur schreiben) da diese linear ist und das ganze dann evtl. weniger Artefakte hat.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (17.06.2010, 15:15)


LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

15

17.06.2010, 17:23

Ok, für was man die dann genau alles verwenden kann/soll ist natürlich eine andere Frage.

Da ich das aber jetzt schon mal besser mit dem OpenGL InternalFormat verstanden habe, würde ich jetzt gerne wieder zu den Direct3D9 Texturen kommen.
Derzeit habe ich immer 4 byte pro Pixel. Egal welches eigentliche Format nun genutzt wird.
Mit D3D9 verändert man ja die Farbinformationen des ImageBuffers durch die Funktion "IDirect3DTexture9::LoadRect" und erhält dann einen "D3DLOCKED_RECT::pBits" void pointer.
Wenn ich mit "CreateTexture" eine Texture mit dem Format "D3DFMT_L8" (für 'Luminance' - also quasi GrayScaled) erstelle, ist der pBits pointer dann auch nur Width*Height*1 bytes groß?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

16

17.06.2010, 17:41

Ein void* ist immer gleich groß, üblicherweise 32 oder 64bit :P
Aber ja, der Buffer worauf er zeigt ist dann natürlich mindestens Width * Height * 1 Bytes groß (kann auch größer sein, pitch beachten!).

Werbeanzeige