Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 11, 2025 06:53

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Mär 26, 2004 22:11 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Ich habe eine kleine Klasse für den PBuffer geschrieben leider gab es bei der Funktion wglChoosePixelFormatARB einen Fehler. Wie sich rausstelle wurde in der Opengl12 der Variable wglChoosePixelFormatARB nur auf Anforderung die Funktion zugewiesen. Also rief ich die entsprechende procedure auf welche diesen Schritt durchführt, aber ohne erfolg da wglChoosePixelFormatARB immer noch nil war. Also rief ich im Debug Modus die Funktion wglgetProcAddress('wglChoosePixelFormatARB') von "hand" auf. Allerdings mit dem gleichen Resultat nil.
Unterstütz meine Grafikarte etwa keine pBuffer oder mache ich etwas falsch?
MfG
IFlo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 26, 2004 22:24 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
PBuffer werden eigentlich (inzwischen) auf so ziemlich jeder Grafikkarte unterstützt, und bei NV AFAIK sogar ab der TNT, es sollte also bei dir funzen. Warum du keinen gültigen Funktionszeiger bekommst, ist mir etwas rätselhaft. Ich gehe doch mal davon aus das die OpenGL-Libs geladen sind und du nen aktiven Renderkontext hast, oder?

Ansonsten nutz doch unseren OpenGL1.5-Header, der wglChoosePixelFormatARB problemlos lädt.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 29, 2004 20:36 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
:oops: Ich hätte es über eine Procedure aufrufen lassen müssen welche sich ActiverenderingContext nennt.(Sehr aussage kräfiger Name).

Allerdings habe ich immer noch Problemme mit dem PBuffer.
Das Bild ist immer nur Weiß. Fehlt etwas in diesem Code? :
Code:
  1.  
  2. unit PBufferUnit;
  3.  
  4. interface
  5. uses WINDOWS,sysutils,OpenGL12;
  6. type
  7.   TpBuffer= class
  8.   private
  9.     FDC : HDC;
  10.     FRC : HGLRC;
  11.     FHandle: HPBUFFERARB;
  12.     FWidth:Integer;
  13.     FHeight:Integer;
  14.   public
  15.      TextureID:GLuint;
  16.      Constructor  Create(const WindowDC:HDC;const WindowRC:HGLRC;const Width,Height:Integer);
  17.      Destructor Destroy; override;
  18.      property DC:HDC read FDC;
  19.      property RC:HGLRC read FRC;
  20.   end;
  21. implementation
  22. type
  23.    T8PFB =array [0..16]of Integer ;
  24.  
  25. const
  26.   cPixelFormatBuffer:T8PFB =
  27.                      (WGL_SUPPORT_OPENGL_ARB, 1, // pbuffer will be used with gl
  28.                      WGL_DRAW_TO_PBUFFER_ARB, 1, // enable render to pbuffer
  29.                      //WGL_BIND_TO_TEXTURE_RGBA_ARB, 1, // pbuffer will be used as a texture
  30.                      WGL_RED_BITS_ARB, 8, // at least 8 bits for RED channel
  31.                      WGL_GREEN_BITS_ARB, 8, // at least 8 bits for GREEN channel
  32.                      WGL_BLUE_BITS_ARB, 8, // at least 8 bits for BLUE channel
  33.                      WGL_ALPHA_BITS_ARB, 8, // at least 8 bits for ALPHA channel
  34.                      WGL_DEPTH_BITS_ARB, 24, // at least 24 bits for depth buffer
  35.                      WGL_DOUBLE_BUFFER_ARB, 1, // we don’t require double buffering
  36.                      0 );// zero terminates the list
  37.  
  38.                      
  39. Constructor TpBuffer.Create(const WindowDC:HDC;const WindowRC:HGLRC;const Width,Height:Integer);
  40. var
  41.   PFB:T8PFB;//Unser wunsch PixelFormat für das Buffer
  42.   Count:Integer;
  43.   pfbID:Integer; //Das PixelFormat welches wir erhalten haben
  44.   EmptyInt:Integer;
  45. begin
  46.   EmptyInt := 0;
  47.   FWidth := Width;
  48.   FHeight:= Height;
  49.   PFB := cPixelFormatBuffer;
  50.   Count := 0;
  51.   // choose a pixel format that meets our minimum requirements
  52.   wglChoosePixelFormatARB(Windowdc,@PFB, @EmptyInt, 1,@pfbID,@count);
  53.   if Count = 0 then raise Exception.Create('P-buffer: Unable to find an acceptable pixel format');
  54.   // allocate the pbuffer
  55.   FHandle := wglCreatePbufferARB(Windowdc, pfbID, width, height, @EmptyInt );
  56.   FDC := wglGetPbufferDCARB(FHandle);
  57.   FRC := wglCreateContext(FDC);
  58.   if FHandle = 0 then raise Exception.Create('P-buffer: Unable to create P-buffer');
  59.   // make a texture object for binding the pbuffer to
  60.  
  61.   {~}wglShareLists(windowRC, FRC);
  62.  
  63.   glGenTextures(1, @TextureID);
  64.   glBindTexture(GL_TEXTURE_2D, TextureID);
  65.   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  66.   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  67.   {~}glTexEnvi(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  68.   {~}glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, Width, Height, 0);
  69.  
  70.  
  71.  
  72. end;
  73. Destructor TpBuffer.Destroy;
  74. begin
  75.   //wglReleaseTexImageARB(FHandle, WGL_FRONT_LEFT_ARB);
  76.   wglDeleteContext(FRC);
  77.   wglReleasePbufferDCARB(FHandle, FDC);
  78.   wglDestroyPbufferARB(FHandle);
  79.   glDeleteTextures(1, @TextureID);
  80. end;
  81. end.
  82.  

MfG
IFlo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 29, 2004 21:28 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Da fehlt doch das Rendern der Szene in den PBuffer, also quasi das wichtigste. Haste da evtl. was bei der Funktionsweise des PBuffers nicht ganz verstanden? Der PBuffer ist quasi ein komplett eigener Renderkontext. Das sieht dann in der Praxis in etwa so aus :
  • Kontext des PBuffers aktiveren (wglMakeCurrent(PBuffer.DC, PBuffer.RC)
  • Deine Szene in den PBuffer rendern
  • Diese Szene in die Textur deines PBuffers kopieren (glCopyTexImage)
  • Wieder in den normalen Kontext wechseln (wglMakeCurrent(DC, RC))
  • Dort dann die Textur des PBuffers binden und an Primitive rendern

Ansonsten ist mir noch das aufgefallen : WGL_DOUBLE_BUFFER_ARB, 1. D.h. das du einen PBuffer mit Front- und Backbuffer erstellst, was man normalerweise nicht macht, verbraucht eben mehr Speicher.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 29, 2004 21:38 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Ich glaube das fehlt:
WGL_PIXEL_TYPE_ARB=WGL_TYPE_RGBA_ARB
WGL_ACCELERATION_ARB=WGL_FULL_ACCELERATION_ARB

Vielleicht funktioniert es wenn man statt den einzelnen Farben direkt die Summe angibt:
WGL_COLOR_BITS_ARB=32

Der PBuffer muß für RTT noch folgende Attribute haben
WGL_TEXTURE_FORMAT_ARB=WGL_TEXTURE_RGBA_ARB
WGL_TEXTURE_TARGET_ARB=WGL_TEXTURE_2D_ARB

Das Kopieren mit glCopyTex[Sub]Image entfällt wenn man den PBuffer an eine Texture bindet. Mir ist aufgefallen, daß ein glCopyTexSubImage bei einem PBuffer der mit RTT Attributen erstellt wurde gar nicht mehr funktioniert. Bei NVidia Karten soll es in diesem Fall unerträglich langsam sein. Dürfte eigentlich nicht so sein. Hat jemand anders auch diese Erfahrung gemacht? PBuffer scheinen allgemein sehr anfällig für diese Attributkombinationen zu sein und es scheinen nur bestimmte wirklich zu funktionieren.

Nachtrag: Der Pbuffer ist die scheußlichste Stelle an der ganzen OpenGL API und wird hoffentlich bald(?) überholt. So anfällig und kompliziert entspricht er nicht der restlichen Eleganz der OpenGL Schnittstelle. Man hätte RTT folgendermaßen implementieren sollen:

Code:
  1.  
  2. glBindTexture(GL_TEXTURE_2D,rendertexture);
  3. glDrawBuffer(GL_TEXTURE0_ARB);
  4. // rendern...
  5. glDrawBuffer(GL_BACK);
  6. // Texturen benutzen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 01, 2004 16:33 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Diese Zeile Code
Code:
  1.  
  2. glEnable(GL_TEXTURE_2D);
  3.  

war vor
Code:
  1.  
  2. wglMakeCurrent(pbuffer.dc, PBuffer.rc);
  3.  

"gerutscht".
Ich muss allerdings eine von diesen beiden Zeilen aufrufen, ansonsten gibt es ein ähnliches Bild wie oben nur das statt Gras nur Grau zu sehen war.
Code:
  1.  
  2.   glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, BTPixels, BTPixels, 0);
  3.   glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, BTPixels, BTPixels);
  4.  

Weis einer von euch was der Unterschied zwischen den beiden Funktionen ist?
Das steht doch im Gegensatz zu dem was du gesagt LarsMiddendorf oder binde ich etwa in meinen Code oben den PBuffer nicht an eine Textur?
Zitat:
Das Kopieren mit glCopyTex[Sub]Image entfällt wenn man den PBuffer an eine Texture bindet.

@SOS: Die Unit die ich oben gepostet hatte behandelt nur den PBuffer und nicht das Zeichnen(, der Code dazu steht in der BodenUnit).
Danke für eure Hilfe.
Euer
IFlo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 01, 2004 16:41 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
glCopyTexImage2D
Reserviert Speicher für deine Textur und dimensioniert diese auch, bevor sie dann aus dem Puffer geholt wird.

glCopyTexSubImage2D
Kopiert nur den Pufferinhalt in den bereits vorhandenen Speicher, unter Angabe sowohl der Dimension als auch der Startposition. Damit kann man z.B. nur Teile des Puffers in eine Textur kopieren.

Also sollte man am Anfang einmal glCopyTexImage2D aufrufen, damit OpenGL Speicher für die Textur reserviert hat, und danach dann nur noch (solange sich die Größe nicht ändert) glCopyTexSubImage2D, da dort nichts allokiert wird und es daher im Normalfall schneller ist.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 01, 2004 16:48 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Es reicht also im Prinzip wenn mein Constructor vom PBuffer das hier aufruft:
Code:
  1.  
  2.   {~}glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, Width, Height, 0);
  3.  

Und beim Zeichnen brauche ich dann nur noch glCopyTexSubImage2D aufrufen.
Und wieder Rechenleistung gesparrt, :D
Danke SonofSatan für die Erklärung.
MfG
IFlo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 01, 2004 17:06 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Wenn der Pbuffer mit RTT Attributen erstellt wurde, muß man die Texture gar nicht mehr kopieren und auch keinen Speicher außer den PBuffer dafür belegen. Das ist ja gerade der Sinn von ARB_render_texture. Man muß allerdings trotzdem ein Texture Objekt mit glGenTextures erstellen. Dann wird der Pbuffer als Texture verwendet.

Code:
  1. glBindTexture(GL_TEXTURE_2D,textureid);
  2. wglBindTexImageARB(PBufferHandle,WGL_FRONT_LEFT_ARB);


Bevor man wieder in den Pbuffer rendert muß er wieder von der Texture entfernt werden:

Code:
  1.  wglReleaseTexImageARB(PBufferHandle,WGL_FRONT_LEFT_ARB);


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]