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

Aktuelle Zeit: Sa Jul 05, 2025 15:23

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



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Jul 24, 2009 03:35 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
HI,

ich bin grad dabei VBOs in mein Programm einzubauen. Um das alles n bisl einfacher zu gestalten, hab ich mir das in ne extra Klasse gekapselt. Aber ich hab noch 2 Sachen womit ich nich klar komm:
1. ich habe 20.000 verschiedene "WriteBufferData"-Prozeduren, die funktionieren auch, aber das sieht etwas unschön aus, also wollt ich die alle in eine Prozedur kapseln (procedure TVertexBufferObject.WriteBufferData(Data: Pointer; VertexType, Usage: Cardinal)) Da wird aber irgendwie der Pointer net weiter gegeben?! die ganzen Variablen haben die richtigen werte, das hab ich schon mit den anderen Prozeduren verglichen...

2. beim direkten schreiben in den Speicher erhalt ich beim schließen des Programms eine zugriffsverletzung. Und das Quad wird auch nich gerendert.

wäre net wenn sich das ma jmd ansehen könnte, code folgt...

Mfg & Thx Bergmann

Code:
  1. procedure TForm1.Init;
  2. var Vertex: TVertexT2fV3fArray;
  3. begin
  4.   VBO := TVertexBufferObject.Create;
  5.  
  6.   SetLength(vertex, 4);
  7.   with vertex[0] do
  8.     begin S := 1; T := 1; X :=  1; Y :=  1; Z := 0; end;
  9.   with vertex[1] do
  10.     begin S := 0; T := 1; X := -1; Y :=  1; Z := 0; end;
  11.   with vertex[2] do
  12.     begin S := 0; T := 0; X := -1; Y := -1; Z := 0; end;
  13.   with vertex[3] do
  14.     begin S := 1; T := 0; X :=  1; Y := -1; Z := 0; end;
  15.   VBO.WriteBufferData(vertex, GL_STATIC_DRAW); //geht
  16.   VBO.WriteBufferData(@Vertex, GL_T2F_V3F, GL_STATIC_DRAW); //geht nich, Quad wird nich gezeichnet...
  17.  
  18.  
  19.   //geht nich, Quad wird nich gezeichnet + Zugriffsverletzung beim beenden...
  20.   VBO.InitDirectWrite(4, GL_T2F_V3F, GL_STATIC_DRAW);
  21.   VBO.DirectWrite(1,1, 1, 1,0);
  22.   VBO.DirectWrite(0,1,-1, 1,0);
  23.   VBO.DirectWrite(0,0,-1,-1,0);
  24.   VBO.DirectWrite(1,0, 1,-1,0);
  25.   VBO.FinishDirectWrite;
  26.  
  27. //natürlich nehm ich nur eine der 3 Menthoden....
  28. end;


Code:
  1.   //VertexTypen für das VertexBufferObject
  2.   //T - Texture, C - Color, N - Normale, V - Vertex
  3.   //f - Float, b - Byte
  4.   //Bsp.: TVertex T2fV3f erwartet 2-FloatParameter für Texturen
  5.   //      und 3 FloatParameter Vertex
  6.   TVertexV2f          = packed record                   X,Y  : TGLFloat; end;   //GL_V2F
  7.   TVertexV3f          = packed record                   X,Y,Z: TGLFloat; end;   //GL_V3F
  8.   TVertexC4bV2f       = packed record     R,G,B,A: Byte;X,Y  : TGLFloat; end;   //GL_C4UB_V2F
  9.   TVertexC4bV3f       = packed record     R,G,B,A: Byte;X,Y,Z: TGLFLoat; end;   //GL_C4UB_V3F
  10.   TVertexC3fV3f       = packed record     R,G,B,        X,Y,Z: TGlFloat; end;   //GL_C3F_V3F
  11.   TVertexN3fV3f       = packed record             U,V,W,X,Y,Z: TGLFloat; end;   //GL_N3F_V3F
  12.   TVertexC4fN3fV3f    = packed record     R,G,B,A,U,V,W,X,Y,Z: TGLFloat; end;   //GL_C4F_N3F_V3F
  13.   TVertexT2fV3f       = packed record S,T,              X,Y,Z: TGLFloat; end;   //GL_T2F_V3F
  14.   TVertexT2fC4bV3f    = packed record S,T: TGLFloat;                            //T2F
  15.                                           R,G,B,A: Byte;                        //C4UB
  16.                                                         X,Y,Z: TGLFloat; end;   //V3F - GL_T2F_C4UB_V3F
  17.   TVertexT2fC3fV3f    = packed record S,T,R,G,B,        X,Y,Z: TGLFloat; end;   //GL_T2F_C3F_V3F
  18.   TVertexT2fN3fV3f    = packed record S,T,        U,V,W,X,Y,Z: TGLFloat; end;   //GL_T2F_N3F_V3F
  19.   TVertexT2fC4fN3fV3f = packed record S,T,R,G,B,A,U,V,W,X,Y,Z: TGLFloat; end;   //GL_T2F_C4F_N3F_V3F
  20.  
  21.   //ArrayTypen der VertexTypen
  22.   TVertexV2fArray           = array of TVertexV2f;
  23.   TVertexV3fArray           = array of TVertexV3f;
  24.   TVertexC4bV2fArray        = array of TVertexC4bV2f;
  25.   TVertexC4bV3fArray        = array of TVertexC4bV3f;
  26.   TVertexC3fV3fArray        = array of TVertexC3fV3f;
  27.   TVertexN3fV3fArray        = array of TVertexN3fV3f;
  28.   TVertexC4fN3fV3fArray     = array of TVertexC4fN3fV3f;
  29.   TVertexT2fV3fArray        = array of TVertexT2fV3f;
  30.   TVertexT2fC4bV3fArray     = array of TVertexT2fC4bV3f;
  31.   TVertexT2fC3fV3fArray     = array of TVertexT2fC3fV3f;
  32.   TVertexT2fN3fV3fArray     = array of TVertexT2fN3fV3f;
  33.   TVertexT2fC4fN3fV3fArray  = array of TVertexT2fC4fN3fV3f;
  34.  
  35.   //Pointer der Arrays
  36.   PVertexV2fArray           = ^TVertexV2fArray;
  37.   PVertexV3fArray           = ^TVertexV3fArray;
  38.   PVertexC4bV2fArray        = ^TVertexC4bV2fArray;
  39.   PVertexC4bV3fArray        = ^TVertexC4bV3fArray;
  40.   PVertexC3fV3fArray        = ^TVertexC3fV3fArray;
  41.   PVertexN3fV3fArray        = ^TVertexN3fV3fArray;
  42.   PVertexC4fN3fV3fArray     = ^TVertexC4fN3fV3fArray;
  43.   PVertexT2fV3fArray        = ^TVertexT2fV3fArray;
  44.   PVertexT2fC4bV3fArray     = ^TVertexT2fC4bV3fArray;
  45.   PVertexT2fC3fV3fArray     = ^TVertexT2fC3fV3fArray;
  46.   PVertexT2fN3fV3fArray     = ^TVertexT2fN3fV3fArray;
  47.   PVertexT2fC4fN3fV3fArray  = ^TVertexT2fC4fN3fV3fArray;  
  48.  
  49.   VertexBufferException = class(Exception);
  50.   TVertexBufferObject = class(TObject)
  51.   private
  52.     //das eigentliche VBO (Index von OpenGL)
  53.     fVertexBufferObject                         : gluInt;
  54.     //Anzahl der zu übergebenden Vertex (für Speicherreservierung)
  55.     //|            Anzahl der bereits übergebenen Vertex
  56.     fVertexAnzahl, fVertexCount                 : Integer;
  57.     //Typ der zu zeichnenden Vertex (GL_V2F, ...)
  58.     fVertexType                                 : Cardinal;
  59.     //gibt an ob das DirectWrite richtig initialisiert wurde
  60.     fDirectWriteInit                            : Boolean;
  61.     //StartAdresse der Vertex im GrakaSpeicher
  62.     //|                  Adresse des nächsten vertex was übergeben wird
  63.     fStartAdressPointer, fActiveAdressPointer   : Pointer;
  64.   public
  65.     //Übergibt die erhaltenen Daten an den GrakaSpeicher
  66.     procedure WriteBufferData(Data: Pointer; VertexType, Usage: Cardinal); overload;
  67.     procedure WriteBufferData(Data: array of          TVertexV2f; Usage: Cardinal); overload;
  68.     procedure WriteBufferData(Data: array of          TVertexV3f; Usage: Cardinal); overload;
  69.     procedure WriteBufferData(Data: array of       TVertexC4bV2f; Usage: Cardinal); overload;
  70.     procedure WriteBufferData(Data: array of       TVertexC4bV3f; Usage: Cardinal); overload;
  71.     procedure WriteBufferData(Data: array of       TVertexC3fV3f; Usage: Cardinal); overload;
  72.     procedure WriteBufferData(Data: array of       TVertexN3fV3f; Usage: Cardinal); overload;
  73.     procedure WriteBufferData(Data: array of    TVertexC4fN3fV3f; Usage: Cardinal); overload;
  74.     procedure WriteBufferData(Data: array of       TVertexT2fV3f; Usage: Cardinal); overload;
  75.     procedure WriteBufferData(Data: array of    TVertexT2fC4bV3f; Usage: Cardinal); overload;
  76.     procedure WriteBufferData(Data: array of    TVertexT2fC3fV3f; Usage: Cardinal); overload;
  77.     procedure WriteBufferData(Data: array of    TVertexT2fN3fV3f; Usage: Cardinal); overload;
  78.     procedure WriteBufferData(Data: array of TVertexT2fC4fN3fV3f; Usage: Cardinal); overload;
  79.     procedure InitDirectWrite(VertexCount: Integer; VertexType, Usage: Cardinal);//initialisiert die direkte Eingabe in den Speicher
  80.     function  DirectWrite(S,T,X,Y,Z: TGLFloat): Boolean;                        //schreibt ein neues Vertex (vom Typ GL_T2F_V3F) in den Speicher
  81.     procedure FinishDirectWrite;                                                //schließt das Directe Schreiben in den Speicher ab
  82.     procedure Render(Mode: Cardinal);                                           //Zeichnet das VBO
  83.     constructor Create;                                                         //erzeugt das VBO
  84.     destructor  Destroy; override;                                              //gibt das VBO frei
  85.   end;
  86.  
  87. implementation
  88.  
  89. ////////////////////////////////////////////////////////////////////////////////
  90. //VertexBufferObject////////////////////////////////////////////////////////////
  91. ////////////////////////////////////////////////////////////////////////////////
  92.  
  93. procedure TVertexBufferObject.WriteBufferData(Data: Pointer; VertexType, Usage: Cardinal);
  94. var size: Integer;
  95. begin
  96.   size := 0;
  97.   case VertexType of
  98.     GL_V2F: begin
  99.       fVertexAnzahl :=  Length(PVertexV2fArray(Data)^);
  100.       size := fVertexAnzahl*SizeOf(TVertexV2f);
  101.     end;
  102.     GL_V3F: begin
  103.       fVertexAnzahl :=  Length(PVertexV3fArray(Data)^);
  104.       size := fVertexAnzahl*SizeOf(TVertexV3f);
  105.     end;
  106.     GL_C4UB_V2F: begin
  107.       fVertexAnzahl :=  Length(PVertexC4bV2fArray(Data)^);
  108.       size := fVertexAnzahl*SizeOf(TVertexC4bV2f);
  109.     end;
  110.     GL_C4UB_V3F: begin
  111.       fVertexAnzahl :=  Length(PVertexC4bV3fArray(Data)^);
  112.       size := fVertexAnzahl*SizeOf(TVertexC4bV3f);
  113.     end;
  114.     GL_C3F_V3F: begin
  115.       fVertexAnzahl :=  Length(PVertexC3fV3fArray(Data)^);
  116.       size := fVertexAnzahl*SizeOf(TVertexC3fV3f);
  117.     end;
  118.     GL_N3F_V3F: begin
  119.       fVertexAnzahl :=  Length(PVertexN3fV3fArray(Data)^);
  120.       size := fVertexAnzahl*SizeOf(TVertexN3fV3f);
  121.     end;
  122.     GL_C4F_N3F_V3F: begin
  123.       fVertexAnzahl :=  Length(PVertexC4fN3fV3fArray(Data)^);
  124.       size := fVertexAnzahl*SizeOf(TVertexC4fN3fV3f);
  125.     end;
  126.     GL_T2F_V3F: begin
  127.       fVertexAnzahl :=  Length(PVertexT2fV3fArray(Data)^);
  128.       size := fVertexAnzahl*SizeOf(TVertexT2fV3f);
  129.     end;
  130.     GL_T2F_C4UB_V3F: begin
  131.       fVertexAnzahl :=  Length(PVertexT2fC4bV3fArray(Data)^);
  132.       size := fVertexAnzahl*SizeOf(TVertexT2fC4bV3f);
  133.     end;
  134.     GL_T2F_C3F_V3F: begin
  135.       fVertexAnzahl :=  Length(PVertexT2fC3fV3fArray(Data)^);
  136.       size := fVertexAnzahl*SizeOf(TVertexT2fC3fV3f);
  137.     end;
  138.     GL_T2F_N3F_V3F: begin
  139.       fVertexAnzahl :=  Length(PVertexT2fN3fV3fArray(Data)^);
  140.       size := fVertexAnzahl*SizeOf(TVertexT2fN3fV3f);
  141.     end;
  142.     GL_T2F_C4F_N3F_V3F: begin
  143.       fVertexAnzahl :=  Length(PVertexT2fC4fN3fV3fArray(Data)^);
  144.       size := fVertexAnzahl*SizeOf(TVertexT2fC4fN3fV3f);
  145.     end;
  146.   end;
  147.  
  148.   fVertexType := VertexType;
  149. //HIER ist ein Fehler. ich glaub ma das der Pointer (Data) irgendwie ncih richtig
  150. //weitergegeben wird, denn wenn ich eine extra übergabe-variable mach und das
  151. //@vertex im prozedur-aufruf hab, dann gehts?!
  152.   glBufferDataARB(GL_ARRAY_BUFFER, size, Data, Usage);
  153. end;
  154.  
  155. //Übergibt die erhaltenen Daten an den GrakaSpeicher
  156. procedure TVertexBufferObject.WriteBufferData(Data: array of TVertexV2f; Usage: Cardinal);
  157. begin
  158.   fVertexAnzahl := Length(Data);                                                //VertexAnzahl speichern (wichtig beim rendern)
  159.   fVertexType := GL_V2F;                                                        //VertexTyp speichern (wichtig beim rendern)
  160.   glBufferDataARB(GL_ARRAY_BUFFER, SizeOf(Data), @Data, Usage);
  161. end;
  162.  
  163. //analog zu oben
  164. procedure TVertexBufferObject.WriteBufferData(Data: array of TVertexV3f; Usage: Cardinal);
  165. begin
  166.   fVertexAnzahl := Length(Data);
  167.   fVertexType := GL_V3F;
  168.   glBufferDataARB(GL_ARRAY_BUFFER, SizeOf(Data), @Data, Usage);
  169. end;
  170.  
  171. //analog zu oben
  172. procedure TVertexBufferObject.WriteBufferData(Data: array of TVertexC4bV2f; Usage: Cardinal);
  173. begin
  174.   fVertexAnzahl := Length(Data);
  175.   fVertexType := GL_C4UB_V2F;
  176.   glBufferDataARB(GL_ARRAY_BUFFER, SizeOf(Data), @Data, Usage);
  177. end;
  178.  
  179. //analog zu oben
  180. procedure TVertexBufferObject.WriteBufferData(Data: array of TVertexC4bV3f; Usage: Cardinal);
  181. begin
  182.   fVertexAnzahl := Length(Data);
  183.   fVertexType := GL_C4UB_V3F;
  184.   glBufferDataARB(GL_ARRAY_BUFFER, SizeOf(Data), @Data, Usage);
  185. end;
  186.  
  187. //analog zu oben
  188. procedure TVertexBufferObject.WriteBufferData(Data: array of TVertexC3fV3f; Usage: Cardinal);
  189. begin
  190.   fVertexAnzahl := Length(Data);
  191.   fVertexType := GL_C3F_V3F;
  192.   glBufferDataARB(GL_ARRAY_BUFFER, SizeOf(Data), @Data, Usage);
  193. end;
  194.  
  195. //analog zu oben
  196. procedure TVertexBufferObject.WriteBufferData(Data: array of TVertexN3fV3f; Usage: Cardinal);
  197. begin
  198.   fVertexAnzahl := Length(Data);
  199.   fVertexType := GL_N3F_V3F;
  200.   glBufferDataARB(GL_ARRAY_BUFFER, SizeOf(Data), @Data, Usage);
  201. end;
  202.  
  203. //analog zu oben
  204. procedure TVertexBufferObject.WriteBufferData(Data: array of TVertexC4fN3fV3f; Usage: Cardinal);
  205. begin
  206.   fVertexAnzahl := Length(Data);
  207.   fVertexType := GL_C4F_N3F_V3F;
  208.   glBufferDataARB(GL_ARRAY_BUFFER, SizeOf(Data), @Data, Usage);
  209. end;
  210.  
  211. //analog zu oben
  212. procedure TVertexBufferObject.WriteBufferData(Data: array of TVertexT2fV3f; Usage: Cardinal);
  213. begin
  214.   fVertexAnzahl := Length(Data);
  215.   fVertexType := GL_T2F_V3F;
  216.   glBufferDataARB(GL_ARRAY_BUFFER, SizeOf(Data), @Data, Usage);
  217. end;
  218.  
  219. //analog zu oben
  220. procedure TVertexBufferObject.WriteBufferData(Data: array of TVertexT2fC4bV3f; Usage: Cardinal);
  221. begin
  222.   fVertexAnzahl := Length(Data);
  223.   fVertexType := GL_T2F_C4UB_V3F;
  224.   glBufferDataARB(GL_ARRAY_BUFFER, SizeOf(Data), @Data, Usage);
  225. end;
  226.  
  227. //analog zu oben
  228. procedure TVertexBufferObject.WriteBufferData(Data: array of TVertexT2fC3fV3f; Usage: Cardinal);
  229. begin
  230.   fVertexAnzahl := Length(Data);
  231.   fVertexType := GL_T2F_C3F_V3F;
  232.   glBufferDataARB(GL_ARRAY_BUFFER, SizeOf(Data), @Data, Usage);
  233. end;
  234.  
  235. //analog zu oben
  236. procedure TVertexBufferObject.WriteBufferData(Data: array of TVertexT2fN3fV3f; Usage: Cardinal);
  237. begin
  238.   fVertexAnzahl := Length(Data);
  239.   fVertexType := GL_T2F_N3F_V3F;
  240.   glBufferDataARB(GL_ARRAY_BUFFER, SizeOf(Data), @Data, Usage);
  241. end;
  242.  
  243. //analog zu oben
  244. procedure TVertexBufferObject.WriteBufferData(Data: array of TVertexT2fC4fN3fV3f; Usage: Cardinal);
  245. begin
  246.   fVertexAnzahl := Length(Data);
  247.   fVertexType := GL_T2F_C4F_N3F_V3F;
  248.   glBufferDataARB(GL_ARRAY_BUFFER, SizeOf(Data), @Data, Usage);
  249. end;
  250.  
  251. ////////////////////////////////////////////////////////////////////////////////
  252.  
  253. //initialisiert die direkte Eingabe in den Speicher
  254. procedure TVertexBufferObject.InitDirectWrite(VertexCount: Integer; VertexType, Usage: Cardinal);
  255. var Size: Integer;
  256. begin
  257.   fVertexAnzahl     := VertexCount;                                             //VertexAnzahl übernehmen
  258.   fVertexType       := VertexType;                                              //VertexTyp übernehmen
  259.   Size := 0;                                                                    //size initialisieren
  260.   case fVertexType of                                                           //je nach Typ die größe bestimmen
  261.                 GL_V2F: Size := SizeOf(TVertexV2f);
  262.                 GL_V3F: Size := SizeOf(TVertexV3f);
  263.            GL_C4UB_V2F: Size := SizeOf(TVertexC4bV2f);
  264.            GL_C4UB_V3F: Size := SizeOf(TVertexC4bV3f);
  265.             GL_C3F_V3F: Size := SizeOf(TVertexC3fV3f);
  266.             GL_N3F_V3F: Size := SizeOf(TVertexN3fV3f);
  267.         GL_C4F_N3F_V3F: Size := SizeOf(TVertexC4fN3fV3f);
  268.             GL_T2F_V3F: Size := SizeOf(TVertexT2fV3f);
  269.        GL_T2F_C4UB_V3F: Size := SizeOf(TVertexT2fC4bV3f);
  270.         GL_T2F_C3F_V3F: Size := SizeOf(TVertexT2fC3fV3f);
  271.         GL_T2F_N3F_V3F: Size := SizeOf(TVertexT2fN3fV3f);
  272.     GL_T2F_C4F_N3F_V3F: Size := SizeOf(TVertexT2fC4fN3fV3f);
  273.   end;
  274.   glBufferDataARB(GL_ARRAY_BUFFER, fVertexAnzahl*Size, nil, Usage);             //Speicher reservieren
  275.  
  276.   fStartAdressPointer := glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);           //StartAdr. des reserv. Speichers holen
  277.   fActiveAdressPointer := fStartAdressPointer;                                  //Adresse des nächsten vertex festlegen
  278.   fVertexCount := 0;                                                            //vertexCount initialisieren
  279.  
  280.   fDirectWriteInit := True;                                                     //Initialisiereung abgeschlossen --> TRUE
  281. end;
  282.  
  283. //schreibt das Vertex direkt in den Speicher
  284. function TVertexBufferObject.DirectWrite(S,T,X,Y,Z: TGLFloat): Boolean;
  285. //Zeiger auf ein TVertexT2fV3f
  286. var Pointer: ^TVertexT2fV3f;
  287. begin
  288. //HIER muss auch irgendwo der Wurm drin sein, obwohl ich mich eigentlich strikt
  289. //an das Tutorial gehalten hab, auch wenn ich das bisl zerstückelt hab...
  290.  
  291.   result := False;
  292.   if not fDirectWriteInit           then exit;                                  //wenn noch nicht inisialisiert, dann exit
  293.   if fVertexType <> GL_T2F_V3F      then exit;                                  //wenn nicht der korrekte vertexTyp, dann exit
  294.   if fVertexCount >= fVertexAnzahl  then exit;                                  //wenn max. Anzahl erreicht, dann exit
  295.  
  296.   Pointer := fActiveAdressPointer;                                              //Pointer übergeben
  297.   Pointer^.S := S;                                                              //Daten übernehmen
  298.   Pointer^.T := T;
  299.   Pointer^.X := X;
  300.   Pointer^.Y := Y;
  301.   Pointer^.Z := Z;
  302.  
  303.   inc(PInteger(fActiveAdressPointer), SizeOf(TVertexT2fV3f));                   //Pointer erhöhen, um so auf nächsten Vertex zu zeigen
  304.   inc(fVertexCount);                                                            //VertexCounter erhöhen
  305.  
  306.   result := true;
  307. end;
  308.  
  309. //beendet das Direkte Schreiben in den Speicher
  310. procedure TVertexBufferObject.FinishDirectWrite;
  311. begin
  312.   fDirectWriteInit := False;
  313.   glUnmapBuffer(GL_ARRAY_BUFFER);                                          
  314. end;
  315.  
  316. //rendert das VBO
  317. procedure TVertexBufferObject.Render(Mode: Cardinal);
  318. //speicher die Größe
  319. var Size: Integer;
  320. begin
  321.   Size := 0;                                                                    //initialisieren
  322.   case fVertexType of                                                           //je nach VertexTyp größe berechnen
  323.                 GL_V2F: Size := SizeOf(TVertexV2f);
  324.                 GL_V3F: Size := SizeOf(TVertexV3f);
  325.            GL_C4UB_V2F: Size := SizeOf(TVertexC4bV2f);
  326.            GL_C4UB_V3F: Size := SizeOf(TVertexC4bV3f);
  327.             GL_C3F_V3F: Size := SizeOf(TVertexC3fV3f);
  328.             GL_N3F_V3F: Size := SizeOf(TVertexN3fV3f);
  329.         GL_C4F_N3F_V3F: Size := SizeOf(TVertexC4fN3fV3f);
  330.             GL_T2F_V3F: Size := SizeOf(TVertexT2fV3f);
  331.        GL_T2F_C4UB_V3F: Size := SizeOf(TVertexT2fC4bV3f);
  332.         GL_T2F_C3F_V3F: Size := SizeOf(TVertexT2fC3fV3f);
  333.         GL_T2F_N3F_V3F: Size := SizeOf(TVertexT2fN3fV3f);
  334.     GL_T2F_C4F_N3F_V3F: Size := SizeOf(TVertexT2fC4fN3fV3f);
  335.   end;
  336.  
  337.   glInterleavedArrays(fVertexType, Size, nil);                                  //zeichnen
  338.   glDrawArrays(Mode, 0, fVertexAnzahl);
  339. end;
  340.  
  341. //erzeugt ein VBO
  342. constructor TVertexBufferObject.Create;
  343. begin
  344.   if not GL_ARB_Vertex_Buffer_Object then                                       //wenn nich unterstützt, dann
  345.     raise VertexBufferException.Create('VertexBuffer: not supported');          //erzeuge neue Exception
  346.  
  347.   inherited create;                                                             //erzeugen
  348.  
  349.   glGenBuffers(1, @fVertexBufferObject);                                        //VBO erzeugen
  350.   glBindBufferARB(GL_ARRAY_BUFFER, fVertexBufferObject);                        //VBO binden
  351.   glEnableClientState(GL_VERTEX_ARRAY);                                         //VertexArrays aktivieren
  352. end;
  353.  
  354. //gibt das VBO frei
  355. destructor TvertexBufferObject.Destroy;
  356. begin
  357.   glDeleteBuffers(1, @fVertexBufferObject);                                     //VBO löschen
  358.   inherited Destroy;                                                            //Objekt freigeben
  359. end;
  360.  
  361. end.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 24, 2009 08:25 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Code:
  1. VBO.WriteBufferData(@Vertex, GL_T2F_V3F, GL_STATIC_DRAW); //geht nich, Quad wird nich gezeichnet...

Das funktioniert deswegen nicht, weil du ein dynamisches Array hast. Ein dynamisches Array ist eigentlich nur ein Pointer und die Variable Vertex zeigt in diesem Falle lediglich auf den Speicherbereich an dem sich die Daten in Wirklichkeit befinden. Wenn du also sagst @Vertex übergibst du lediglich die Adresse der Variable Vertex. Und die befindet sich auf den Stack (wo andere Variablen, Rücksprungadressen etc liegen). Und da rein zu schreiben würde mit Sicherheit sehr sehr hässlich enden. Im Falle von dem @Operator (oder auch var und const Parametern) musst du dem Kompiler bewusst sagen, dass du die Daten haben willst. Also @Vertex[0]. Damit meinst du unmissverständlich den ersten Eintrag aus dem Array. Das gleiche gilt für Strings. Das sind auch fast nur dynamische Arrays of char. Genau das Gleiche musst du auch bei Stream.Read/Write beachten.

Ich habe mir bei so etwas angewöhnt wirklich grundsätzlich IMMER genau die Stelle anzugeben die ich haben will. Selbst bei statischen Arrays wo die Variable wirklich auf den Speicher zeigt.

Zitat:
2. beim direkten schreiben in den Speicher erhalt ich beim schließen des Programms eine zugriffsverletzung. Und das Quad wird auch nich gerendert.

Die Berechnung deines Speicheroffsets ist falsch.
Code:
  1. inc(PInteger(fActiveAdressPointer), SizeOf(TVertexT2fV3f)); //Pointer erhöhen, um so auf nächsten Vertex zu zeigen

Du setzt damit den Pointer nicht auf das nächste Vertex sondern du überspringst 3 Vertices. Inc hat eine Besonderheit. Es erhöht Zahlen um 1. Bei Pointern allerdings um die Größe des Types, auf welchen der Pointer zeigt. In deinem Falle castest du auf PInteger, damit zeigt der Pointer auf 4 Bytes Speicher und inc(PIntger) erhöht den Pointer um 4 Bytes. Würdest du auf PByte casten, dann würde der Pointer auf 1 Byte Speicher zeigen und inc(pByte) würde die Adresse nur um 1 erhöhen.

Wenn du also einen Pointer "Vertex: PVertexT2fV3f" hättest, dann würde es genügen "inc(Vertex)" zu machen. Da Inc per Default die Größe berücksichtig und um 1 erhöht landest du genau auf dem nächsten Eintrag. Kannst du die Pointer nicht so typisieren, dann musst du einen Typen benutzen der auf 1 Byte Speicher zeigt. Also "Inc(PByte(Vertex), SizeOf(TVertexT2fV3f))".

PS: Wenn du Pointer auf Records benutzt, dann solltest du diese auch direkt als Typen deklarieren. Denn wenn du Lokal eine Variable vom Typ ^Blah erstellst, dann kann es mitunter vorkommen, dass Delphi rumzickt. Entsprechend oben PBlah = ^TBlah definieren und bei Pointerbenutzung dann PBlah verwenden. Dann gibts auch keine Probleme.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 24, 2009 09:41 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 04, 2006 15:42
Beiträge: 78
Wohnort: Bonn
Programmiersprache: Python, C++, Delphi
Soweit ich weiß wäre die Berechnung des Offsets in Delphi korrekt - unter Freepascal jedoch nicht,
da es wie C Pointerarithmetik unterstützt.

Absolut sicher wäre die Schreibweise "someFloatPointer[i]" - welche unter Delphi nicht kompilierbar ist
und unter FPC auf jeden Fall den richtigen Offset berechnet.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 24, 2009 10:21 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
waran hat geschrieben:
Soweit ich weiß wäre die Berechnung des Offsets in Delphi korrekt - unter Freepascal jedoch nicht

Doch, es funktioniert in FPC auch.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 24, 2009 13:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
waran hat geschrieben:
Soweit ich weiß wäre die Berechnung des Offsets in Delphi korrekt

Ne. Nicht, wenn man das Offset mit INC errechnet. Denn das arbeitet mit der Datengröße zusammen.
Code:
  1. var
  2.   I: Pointer;
  3. begin
  4.   I := nil;
  5.   Inc(PInteger(I), 2); // I = 8
  6.  
  7.   I := nil;
  8.   Inc(PByte(I), 2);    // I = 2
  9. end;


waran hat geschrieben:
welche unter Delphi nicht kompilierbar ist

Ist das damit dann nicht schon wieder hinfällig? ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 24, 2009 13:40 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Tschuldigung, ich habe nicht mitgekriegt, dass die ursprüngliche OffSet-Berechnung des Threadstarters gemeint war. Was ich meinte, war natürlich, dass Lossys Angaben stimmen, und sowohl in Delphi als auch in FPC funktionieren. *Inc/Dec* berücksichtigt bei typisierten Pointern immer die Größe der jeweiligen Type.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 24, 2009 14:13 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Traude hat geschrieben:
ich habe nicht mitgekriegt, dass die ursprüngliche OffSet-Berechnung des Threadstarters gemeint war.

Also wo du das jetzt so sagst bin ich mir auch ganz und gar nicht sicher was waran gemeint hatte. :?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 24, 2009 16:55 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
HI,

Problem 2 wäre damit gelöst:
Code:
  1. inc(PVertexT2fV3f(fActiveAdressPointer));


aber beim 1. Problem komm ich immer noch nich weiter. wenn ich @vertex[0] übergeb kommt ne Zugriffsverletzung...
Ich hab das genau so wie in dem Tutorial gemacht, nur das ich den Pointer meiner Daten ein Prozeduraufruf weiter oben übergeb. wenn ich die Daten ansich übergeb, un dann erst bei glBufferDataARB den Pointer gehts?! das ist aber unpraktich, weil ich dann die 12 verschiedenen Prozeduren brauche und das wollt ich mit der Pointer-Sache eig. umgehen...

MfG Bergmann.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 24, 2009 17:18 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Es kann sein, dass sich das Array genau an dieser Stelle rächt. Denn die Informationen des Arrays liegen nicht bei den Daten. Auf der einen Seite musst du den Pointer der Daten übergeben und auf der anderen Seite brauchst du auch die Nutzdaten des Arrays. Also die Länge.

Alternativ würde mir einfallen, dass du den Pointer auf die Daten übergibst und zusätzlich die Länge (Anzahl Vertices) als Parameter. In der Methode rechnest du dann noch die Größe aus und übergibst das. Sollte ausreichen.


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 4 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.012s | 15 Queries | GZIP : On ]