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

Aktuelle Zeit: Mi Jul 16, 2025 22:50

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Textur in PBuffer kopieren
BeitragVerfasst: Do Mai 20, 2004 18:48 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Ich wollte mit folgenden Code einen Teil des PBuffers in eine Textur laden.
Code:
  1.  
  2.  wglMakeCurrent(pbuffer.dc, PBuffer.rc);
  3.  glBindTexture(GL_TEXTURE_2D,PBuffer.TextureID);
  4.  glCopyTexSubImage2D(GL_TEXTURE_2D, 0,
  5.                                     0,
  6.                                     0,
  7.                                     X,
  8.                                     Y,
  9.                                     Width,
  10.                                     Height);
  11.  wglMakeCurrent(glwindow.dc, glwindow.rc);
  12.  

Aber leider kopierte er nicht einen Teil aus dem PBuffer in die gesammte Textur,
sonder er kopierte den gesammten PBuffer in einen kleinen Bereich der Textur.

Meine Frage jetzt:
Gibt es eine andere Funktion dafür, oder wisst ihr eine Lösung für das Problemm?

Ziel der ganzen Sache ist es, den Boden von meinem Level erst zu Rendern, und ihn im Arbeitsspeicher lagern zu lassen.
Der aktuell gebrauchte Ausschnitt wird, wenn er gebraucht wird in eine Textur kopiert und ausgegeben.

Rendern des Boden dauert zu lange um es wärend des Spieles zu laden.
Und natürlich möchte ich auch den Speicher von meiner Grafikkarte schonen.
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 Mai 20, 2004 18:49 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Man kopiert eigentlich nicht aus dem PBuffer in eine Texture, sondern bindet den PBuffer mit wglBindTexImage an ein Texture Object und kann dann direkt aus dem PBuffer rendern.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 20, 2004 19:02 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Als du mir damals erklärtes wie es geht, haben die von dir genannten Funktionen gar nichts in meinem Projekt bewirkt.
Da aber das Haupt-Problemm war und ist das das eigentliche Rendern des Boden so lange braucht, und ich keine Lösung dafür hatte, habe ich es sein lassen.(Sorry Lars das ich dir kein Feedback gab)

Als ich mir es heute nochmal anschaute kamm ich auf die oben genannte Idee, welche aber an dieser Kopier-Funktion scheiterte.

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 Mai 20, 2004 19:45 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Guck mal ins Shaderforum. Dort hab ich ne Cel-Shading-Demo mit Quellcode gepostet, die ne Klasse zur Kapselung eines PBuffers mitbringt und ausserdem auch zeigt wie man dieses direkte in den Puffer (ohne glTexCopy) nutzt. Evtl. hilft dir das ja weiter.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 20, 2004 20:52 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Man muß den PBuffer mit anderen Attributen erstellen, wenn man ihn nacher an eine Texture binden will. Das ganze System ist sehr anfällig und wenn da ein Parameter nicht stimmt, geht es nicht oder nur sehr langsam. Ein PBuffer der für Texturen erstellt wurde kann eventuell nacher nur noch schlecht für die Benutzung von glCopyTexImage verwendet werden. Die Sache mit dem Contextwechsel ist auch nicht unbedingt geschwindigkeitsförderlich. Der ATI Treiber hat(te) mal einen Fehler, daß Occlusion Query Handles nicht gemeinsam von mehreren RC benutzt werden konnten. Da ich keine Texture rendern muß, die größer als der Bildschirm ist oder mehr als 32Bit pro Texel benötigt, bin ich wieder zurück zu dem ganz normalen glCopyTexSubImage, weil mir das robuster erscheint. Eine Delphi3D.Net Demo zeigt, daß der Geschwindigkeitsunterschied vernachlässigbar ist.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mai 21, 2004 16:02 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Zitat:
die ne Klasse zur Kapselung eines PBuffers mitbringt

Eine Klasse habe ich mir ja schon erstellt, nur leider funktionierte es nicht ohne die Kopier-Funktion. Ich habe mir gerade mal den Code runtergeladen und schaue ihn mir mal an.(Die Anwendung kann ich ja wohl schlecht mit einer Geforce 2mx laufen lassen :wink:

Zitat:
Man muß den PBuffer mit anderen Attributen erstellen, wenn man ihn nacher an eine Texture binden will

Das habe ich so weit ich dich richtig verstanden habe gemacht, aber ich habe irgendetwas habe ich wohl dann doch falsch gemacht.

Vielleicht poste ich ja nochmal meine PBuffer-Klasse, damit wir rausfinden können wo der Fehler liegt.

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 Mai 21, 2004 16:14 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Poste mal alle Attribute für den PBuffer und das PixelFormat. Daran liegt's nämlich meistens.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 22, 2004 14:34 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Hier die gesammte Unit:
Zitat:
interface
uses
WINDOWS,sysutils,OpenGL12;
type
TpBuffer= class
private
FDC : HDC;
FRC : HGLRC;
FWindowDC: HDC;
FWindowRC : HGLRC;
FHandle: HPBUFFERARB;
FWidth:Integer;
FHeight:Integer;
function LoadFunctions:Boolean;
public
TextureID:GLuint;
Constructor Create(const WindowDC:HDC;const WindowRC:HGLRC;const Width,Height:Integer);
Destructor Destroy; override;
property DC:HDC read FDC;
property RC:HGLRC read FRC;
procedure Bind;
procedure RenderMode(ON:Boolean);
end;
const
WGL_FRONT_LEFT_ARB = $2083;
WGL_TEXTURE_FORMAT_ARB = $2072;
WGL_TEXTURE_TARGET_ARB = $2073;
WGL_TEXTURE_2D_ARB = $207A;
WGL_TEXTURE_RGB_ARB = $2075;
WGL_TEXTURE_RGBA_ARB = $2076;
WGL_BIND_TO_TEXTURE_RGB_ARB = $2070;
WGL_BIND_TO_TEXTURE_RGBA_ARB = $2071;

var
//Funktionen für die einfache Verwendung als Textur
wglBindTexImageARB: function(hPbuffer: HPBUFFERARB; iBuffer: TGLint): Boolean; {$IFDEF Win32} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
wglReleaseTexImageARB: function(hPbuffer: HPBUFFERARB; iBuffer: TGLint): Boolean; {$IFDEF Win32} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
implementation
type
TPFB =array [0..18]of Integer ;
const
cPixelFormatBuffer:TPFB =
(WGL_SUPPORT_OPENGL_ARB, 1, // pbuffer will be used with gl
WGL_COLOR_BITS_ARB,32, // 32 bits for color buffer
WGL_DEPTH_BITS_ARB, 24, // 24 bits for depth buffer
WGL_DRAW_TO_PBUFFER_ARB, 1, // enable render to pbuffer
WGL_PIXEL_TYPE_ARB,WGL_TYPE_RGBA_ARB, //RGBA mode
WGL_ACCELERATION_ARB,WGL_FULL_ACCELERATION_ARB,// ?
WGL_BIND_TO_TEXTURE_RGBA_ARB, 1, // pbuffer will be used as a texture
WGL_TEXTURE_FORMAT_ARB,WGL_TEXTURE_RGBA_ARB, // ?
WGL_TEXTURE_TARGET_ARB,WGL_TEXTURE_2D_ARB, // ?
0
);// zero terminates the list

Constructor TpBuffer.Create(const WindowDC:HDC;const WindowRC:HGLRC;const Width,Height:Integer);
var
PFB:TPFB;//Das wunsch PixelFormat für das Buffer
Count:Integer;
pfbID:Integer; //Das PixelFormat welches wir erhalten haben
EmptyInt:Integer;
begin
if not
LoadFunctions then Exception.Create('Für den pBuffer benötigte Funktionen konnten nicht geladen werden');
EmptyInt := 0;
FWidth := Width;
FHeight:= Height;
FWindowDC := WindowDC;
FWindowRC := WindowRC;

PFB := cPixelFormatBuffer;
Count := 0;
// choose a pixel format that meets our minimum requirements
wglChoosePixelFormatARB(Windowdc,@PFB, @EmptyInt, 1,@pfbID,@count);
if Count = 0 then raise Exception.Create('P-buffer: Unable to find an acceptable pixel format');
// allocate the pbuffer
FHandle := wglCreatePbufferARB(Windowdc, pfbID, width, height, @EmptyInt );
FDC := wglGetPbufferDCARB(FHandle);
FRC := wglCreateContext(FDC);
if FHandle = 0 then raise Exception.Create('P-buffer: Unable to create P-buffer');
// make a texture object for binding the pbuffer to

wglShareLists(windowRC, Frc);

glGenTextures(1, @TextureID);
glBindTexture(GL_TEXTURE_2D, TextureID);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexEnvi(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE, GL_MODULATE);

{$IFDEF COPYMODE}
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, Width, Height, 0);
{$ENDIF}

{Grund-Einstellungen}

wglMakeCurrent(Fdc, Frc);

glEnable(GL_TEXTURE_2D);
glViewport(0, 0, Width, Height); //Aktuelle Sicht dem Bild anpassen

wglMakeCurrent(WindowDC, WindowRC);
end;
Destructor TpBuffer.Destroy;
begin
//wglReleaseTexImageARB(FHandle, WGL_FRONT_LEFT_ARB);
wglDeleteContext(FRC);
wglReleasePbufferDCARB(FHandle, FDC);
wglDestroyPbufferARB(FHandle);
glDeleteTextures(1, @TextureID);
end;
procedure TpBuffer.Bind;
begin
glBindTexture(GL_TEXTURE_2D,TextureID);
wglBindTexImageARB(FHandle,WGL_FRONT_LEFT_ARB);
end;

procedure TpBuffer.RenderMode(On:Boolean);
begin
if On then
begin
wglMakeCurrent(FDC, FRC);
wglReleaseTexImageARB(FHandle,WGL_FRONT_LEFT_ARB);
end
else
begin
{$IFDEF COPYMODE}
glBindTexture(GL_TEXTURE_2D, TextureID);
//Bild nur übertragen(Nicht erstellen)
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, FWidth, FHeight);
{$ENDIF}
wglMakeCurrent(Fwindowdc, Fwindowrc);

end;
end;

function TpBuffer.LoadFunctions:Boolean;
begin
result := false;
wglBindTexImageARB := wglGetProcAddress('wglBindTexImageARB');
wglReleaseTexImageARB := wglGetProcAddress('wglReleaseTexImageARB');
//Überprüfen ob es Funktionen gibt die nicht geladen werden konnten.
if @wglReleaseTexImageARB =nil then exit;
if @wglBindTexImageARB = nil then exit;
if @wglChoosePixelFormatARB = nil then exit;
if @wglCreatePbufferARB = nil then exit;
if @wglGetPbufferDCARB = nil then exit;
if @wglReleasePbufferDCARB = nil then exit;
if @wglDestroyPbufferARB = nil then exit;
if @wglQueryPbufferARB = nil then exit;
result := true;
end;

end.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 22, 2004 15:17 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Es gibt zwei Arten von Attributen. Die eine Liste ist für das Pixelformat und die andere für den PBuffer. Die PBuffer Attibute setzt man mit
wglSetPBufferAttribARB nach dem Erstellen des PBuffers. Bei mri funktioniert folgende Konfiguration:

PixelFormat Attribute

WGL_SUPPORT_OPENGL_ARB=GL_TRUE
WGL_DRAW_TO_PBUFFER_ARB=GL_TRUE
WGL_PIXEL_TYPE_ARB=WGL_TYPE_RGBA_ARB
WGL_ACCELERATION_ARB=WGL_FULL_ACCELERATION_ARB
WGL_COLOR_BITS_ARB=32
WGL_DEPTH_BITS_ARB=24
WGL_STENCIL_BITS_ARB=8
WGL_DOUBLE_BUFFER_ARB=GL_FALSE


PBuffer Attribute

WGL_PBUFFER_LARGEST_ARB=GL_FALSE
WGL_BIND_TO_TEXTURE_RGBA_ARB=GL_TRUE
WGL_TEXTURE_FORMAT_ARB=WGL_TEXTURE_RGBA_ARB
WGL_TEXTURE_TARGET_ARB=WGL_TEXTURE_2D_ARB
WGL_MIPMAP_TEXTURE_ARB=GL_FALSE

Wenn man kein Mipmapping für den PBuffer einstellt muß man natürlich auf drauf achten, daß die Texture nicht gemipmapt wird.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 22, 2004 19:21 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Hat leider auch nicht geholfen:
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.     FWindowDC: HDC;
  12.     FWindowRC : HGLRC;
  13.     FHandle: HPBUFFERARB;
  14.     FWidth:Integer;
  15.     FHeight:Integer;
  16.     function LoadFunctions:Boolean;
  17.   public
  18.      TextureID:GLuint;
  19.      Constructor  Create(const WindowDC:HDC;const WindowRC:HGLRC;const Width,Height:Integer);
  20.      Destructor Destroy; override;
  21.      property DC:HDC read FDC;
  22.      property RC:HGLRC read FRC;
  23.      procedure Bind;
  24.      procedure RenderMode(ON:Boolean);
  25.   end;
  26. const
  27.   WGL_FRONT_LEFT_ARB           = $2083;
  28.   WGL_TEXTURE_FORMAT_ARB       = $2072;
  29.   WGL_TEXTURE_TARGET_ARB       = $2073;
  30.   WGL_TEXTURE_2D_ARB           = $207A;
  31.   WGL_TEXTURE_RGB_ARB          = $2075;
  32.   WGL_TEXTURE_RGBA_ARB         = $2076;
  33.   WGL_BIND_TO_TEXTURE_RGB_ARB  = $2070;
  34.   WGL_BIND_TO_TEXTURE_RGBA_ARB = $2071;
  35.   WGL_MIPMAP_TEXTURE_ARB       = $2074;
  36. var
  37.   //Funktionen für die einfache Verwendung als Textur
  38.   wglBindTexImageARB:    function(hPbuffer: HPBUFFERARB; iBuffer: TGLint): Boolean; {$IFDEF Win32} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  39.   wglReleaseTexImageARB: function(hPbuffer: HPBUFFERARB; iBuffer: TGLint): Boolean; {$IFDEF Win32} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  40.   wglSetPbufferAttribARB: function(hPbuffer: HPBUFFERARB; const piAttribList: PGLint): Boolean; {$IFDEF Win32} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  41.  
  42. implementation
  43.  
  44. var
  45.  
  46.   PixelFormatBuffer:array [0..16]of Integer  =
  47.                   (WGL_SUPPORT_OPENGL_ARB , GL_TRUE // pbuffer will be used with gl
  48.                   ,WGL_DRAW_TO_PBUFFER_ARB, GL_TRUE
  49.                   ,WGL_PIXEL_TYPE_ARB     , WGL_TYPE_RGBA_ARB //RGBA mode
  50.                   ,WGL_ACCELERATION_ARB   , WGL_FULL_ACCELERATION_ARB
  51.                   ,WGL_COLOR_BITS_ARB     , 32  // 32 bits for color buffer
  52.                   ,WGL_DEPTH_BITS_ARB     , 24  // 24 bits for depth buffer
  53.                   ,WGL_STENCIL_BITS_ARB   , 8
  54.                   ,WGL_DOUBLE_BUFFER_ARB  , GL_FALSE
  55.                   ,0);  // zero terminates the list
  56.  
  57.   BufferAttrib : array [0..10] of Integer=
  58.                   (WGL_PBUFFER_LARGEST_ARB      , GL_FALSE
  59.                   ,WGL_BIND_TO_TEXTURE_RGBA_ARB , GL_TRUE
  60.                   ,WGL_TEXTURE_FORMAT_ARB       , WGL_TEXTURE_RGBA_ARB
  61.                   ,WGL_TEXTURE_TARGET_ARB       , WGL_TEXTURE_2D_ARB
  62.                   ,WGL_MIPMAP_TEXTURE_ARB       , GL_FALSE
  63.                   ,0 );// zero terminates the list
  64.  
  65. Constructor TpBuffer.Create(const WindowDC:HDC;const WindowRC:HGLRC;const Width,Height:Integer);
  66. var
  67.  Count:Integer;
  68.  pfbID:Integer; //Das PixelFormat welches wir erhalten haben
  69.  EmptyInt:Integer;
  70. begin
  71.  if not LoadFunctions then Exception.Create('Für den pBuffer benötigte Funktionen konnten nicht geladen werden');
  72.  EmptyInt := 0;
  73.  FWidth := Width;
  74.  FHeight:= Height;
  75.  FWindowDC :=  WindowDC;
  76.  FWindowRC :=  WindowRC;
  77.  
  78.  
  79.  Count := 0;
  80.  // choose a pixel format that meets our minimum requirements
  81.  wglChoosePixelFormatARB(Windowdc,@PixelFormatBuffer, @EmptyInt, 1,@pfbID,@count);
  82.  if Count = 0 then raise Exception.Create('P-buffer: Unable to find an acceptable pixel format');
  83.  // allocate the pbuffer
  84.  FHandle := wglCreatePbufferARB(Windowdc, pfbID, width, height, @EmptyInt );
  85.  if FHandle = 0 then raise Exception.Create('P-buffer: Unable to create P-buffer');
  86.  FDC := wglGetPbufferDCARB(FHandle);
  87.  FRC := wglCreateContext(FDC);
  88.  
  89.  if  not wglSetPBufferAttribARB(FHandle,@BufferAttrib) then Exception.Create('Unable tu set pBuffer Attrib');
  90.  
  91.  wglShareLists(windowRC, Frc);
  92.  
  93.  // make a texture object for binding the pbuffer to
  94.  
  95.  glGenTextures(1, @TextureID);
  96.  glBindTexture(GL_TEXTURE_2D, TextureID);
  97.  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  98.  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  99.  
  100.  glTexEnvi(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  101.  
  102.  {$IFDEF COPYMODE}
  103.  glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, Width, Height, 0);
  104.  {$ENDIF}
  105.  
  106.  {Grund-Einstellungen}
  107.  
  108.  wglMakeCurrent(Fdc, Frc);
  109.  
  110.  glEnable(GL_TEXTURE_2D);
  111.  glViewport(0, 0, Width, Height);  //Aktuelle Sicht dem Bild anpassen
  112.  
  113.  wglMakeCurrent(WindowDC, WindowRC);
  114. end;
  115. Destructor TpBuffer.Destroy;
  116. begin
  117.  //wglReleaseTexImageARB(FHandle, WGL_FRONT_LEFT_ARB);
  118.  wglDeleteContext(FRC);
  119.  wglReleasePbufferDCARB(FHandle, FDC);
  120.  wglDestroyPbufferARB(FHandle);
  121.  glDeleteTextures(1, @TextureID);
  122. end;
  123. procedure TpBuffer.Bind;
  124. begin
  125.  glBindTexture(GL_TEXTURE_2D,TextureID);
  126.  wglBindTexImageARB(FHandle,WGL_FRONT_LEFT_ARB);
  127. end;
  128.  
  129. procedure TpBuffer.RenderMode(On:Boolean);
  130. begin
  131.  if On then
  132.  begin
  133.   wglMakeCurrent(FDC, FRC);
  134.   wglReleaseTexImageARB(FHandle,WGL_FRONT_LEFT_ARB);
  135.  end
  136.  else
  137.  begin
  138.   {$IFDEF COPYMODE}
  139.   glBindTexture(GL_TEXTURE_2D, TextureID);
  140.   //Bild nur übertragen(Nicht erstellen)
  141.   glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, FWidth, FHeight);
  142.   {$ENDIF}
  143.   wglMakeCurrent(Fwindowdc, Fwindowrc);
  144.  
  145.  end;
  146. end;
  147.  
  148. function TpBuffer.LoadFunctions:Boolean;
  149. begin
  150.   result := false;
  151.   wglBindTexImageARB      := wglGetProcAddress('wglBindTexImageARB');
  152.   wglReleaseTexImageARB   := wglGetProcAddress('wglReleaseTexImageARB');
  153.   wglSetPbufferAttribARB  := wglGetProcAddress('wglSetPbufferAttribARB');
  154.  
  155.   //Überprüfen ob es Funktionen gibt die nicht geladen werden konnten.
  156.   if @wglReleaseTexImageARB =nil then exit;
  157.   if @wglBindTexImageARB = nil then exit;
  158.   if @wglChoosePixelFormatARB = nil  then exit;
  159.   if @wglCreatePbufferARB = nil then exit;
  160.   if @wglGetPbufferDCARB = nil then exit;
  161.   if @wglReleasePbufferDCARB  = nil then exit;
  162.   if @wglDestroyPbufferARB = nil then exit;
  163.   if @wglQueryPbufferARB = nil then exit;
  164.   if @wglSetPbufferAttribARB = nil then exit;
  165.   result := true;
  166. end;
  167.  
  168. end.
  169.  

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 23, 2004 11:34 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Poste doch auch mal den Code in dem man sieht wie du deinen PBuffer benutzt. Ich schätze mal du machst einen Fehler mit wglBindTexImageARB bzw. wglReleaseTexImageARB, aber da du letzteres über einen Parameter steuerst (On : Boolean) kann man ja schlecht sagen das es daran liegt.

Normalerweise geht das bei direktem RTT nämlich so :
Code:
  1. PixelBuffer.Enable;
  2. // Szene rendern (->PBuffer)
  3. PixelBuffer.Disable;
  4. ...
  5. wglBindTexImageARB...
  6. // Quad mit PBufferinhalt rendern
  7. wglReleaseTexImageARB


Wenn du jetzt z.B. am Ende das wglReleaseTexImageARB vergisst, oder am Anfang das wglBindTexImageARB dann klappts natürlich nicht.

P.S. : Hast du mal meine Unit ausprobiert? Wenn nicht, dann schau dir wenigstens den Source davon an, denn die funktioniert ja tadellos.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 23, 2004 13:04 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Wenn ich rendern möchte:
RenderMode(true);
Code:
  1.  
  2.   wglMakeCurrent(FDC, FRC);
  3.   wglReleaseTexImageARB(FHandle,WGL_FRONT_LEFT_ARB);
  4.  

Wenn ich fertig bin:
RenderMode(false);
Code:
  1.  
  2.  wglMakeCurrent(Fwindowdc, Fwindowrc);
  3.  

Um den PBuffer auf eine Textur zu binden rufe ich pBuffer.bind wobei das geschieht
Code:
  1.  
  2.  glBindTexture(GL_TEXTURE_2D,TextureID);
  3.  wglBindTexImageARB(FHandle,WGL_FRONT_LEFT_ARB);
  4.  

Das ist ja im Prinzip genau das was du da beschrieben hast.
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 Mai 31, 2004 16:27 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Ich glaube jetzt weis ich warum es nicht funktioniert:
Code:
  1.  
  2.  if  not wglSetPBufferAttribARB(FHandle,@BufferAttrib) then Exception.Create('Unable tu set pBuffer Attrib');
  3.  

Seht ihr den Fehler? Ich habe hier das raise vergessen.
Das verhinderte das ich hier informiert wurde das es nicht geklappt hat.

Auch das Reduzieren der Attribute auf nur
Code:
  1.  
  2. ,WGL_BIND_TO_TEXTURE_RGBA_ARB , GL_TRUE
  3.  

half nichts.
Scheinbar unterstützt meine Grafikkarte dieses Feature nicht, oder ich muss mein OpenGL erneuern(allerdings kann ich das ja nicht umbedingt von den Anwendern meines Programmes erwarten :wink: ).
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 Mai 31, 2004 18:19 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Um die Theorie zu überprüfen habe ich mal wie in Sos pBuffer Tutorial die Attribute beim Erstellen gleich mitgegeben.
Und siehe da ich erhalte wie vermutet keinen PBuffer.
MfG
IFlo

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


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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.010s | 16 Queries | GZIP : On ]