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

Aktuelle Zeit: Fr Jul 18, 2025 11:49

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



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: VBO in C#
BeitragVerfasst: Mo Sep 26, 2005 13:07 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
Folgende Frage:
Ich habe jetzt schon einige Dinge in meinem Header( Shadersupport, Supporten von vielen Contexten, Drawfunktionen,..... ), jetzt will ich Vertexinformationen im Speicher der Grafikkarte ablegen.

Das Problem ist natürlich das das auf unsafe Code hinauslaufen würde!
Wie habt ihr das gelößt, wäre über Code sehr Glücklich! Zudem auch wenn es nur mit Pointern geht, da ich bisher nicht mit ihnen in C# gearbeitet habe( Weiss zwar das * der Pointer ist aber mehr auch nicht )!

mfg

Speedmaster

_________________
Shareholder und Leitender Entwickler bei Pipedream-Games.

Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 26, 2005 13:38 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 26, 2002 22:12
Beiträge: 259
Wohnort: Dresden
Lars hat vor einiger Zeit einen Header für C# 2.0 veröffentlicht. Wenn du den ntuzt, kannst du komplett auf Pointer verzichten.
http://www.3d-seite.de/csopengl

_________________
Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jederman ist überzeugt, dass er genug davon habe.
Rene Descartes, frz. Mathematiker u. Philosoph, 1596-1650


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 26, 2005 13:47 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
Magellan hat geschrieben:
Lars hat vor einiger Zeit einen Header für C# 2.0 veröffentlicht. Wenn du den ntuzt, kannst du komplett auf Pointer verzichten.
http://www.3d-seite.de/csopengl


Es ging mir dabei um die Übergabe der Vertexdaten an den Speicher der Grafikkarte, ohne diese im Hauptspeicher vorher abzulegen!

Den Header benutze ich bereits!

_________________
Shareholder und Leitender Entwickler bei Pipedream-Games.

Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 26, 2005 14:37 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
gl.BufferData bzw. gl.BufferSubData hat eine Überladung mit System.Array als Parameter. Da kann man alle Arrays dann übergeben.

Edit: glMapBufferARB gibt einen IntPtr zurück. In der Klasse System.Runtime.InteropServices.Marshal gibt es Methoden direkt an bestimmte Addressen zu schreiben. Ansonsten bleibt wohl nur noch die Sache mit dem unsafe.
IntPtr hat die Methode ToPointer mit der man dann einen (void*) Zeiger bekommen und auf seinen Type casten kann.

Vector* v = (Vector*)gl.MapBufferARB(..., ..., ..., IntPtr.Zero).ToPointer();

Aber was spricht eigentlich dageben gl.BufferData zu nutzen ?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 26, 2005 20:45 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
Wollte es Dynamisch haben, was ist daran nun Falsch( B.z.w. wie schreibe ich es richtig ):
Code:
  1.  
  2.         public void BufferData(List<Vertex_V3F> Data)
  3.         {
  4.             gl.BufferData(gl.ARRAY_BUFFER_ARB, sizeof(Data), Data, gl.STATIC_DRAW_ARB);
  5.         }
  6.  


P.s.: Mag an der Uhrzeit liegen das ich nicht auf einen grünen zweig komme!

_________________
Shareholder und Leitender Entwickler bei Pipedream-Games.

Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 26, 2005 20:57 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Code:
  1.        public void BufferData(List<Vertex_V3F> Data)
  2.         {
  3.             gl.BufferData(gl.ARRAY_BUFFER_ARB, Data.Count*12, Data.ToArray(), gl.STATIC_DRAW_ARB);
  4.         }


Aber Vorsicht. ToArray() kopiert das ganze Array aus der Liste.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 27, 2005 09:49 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
Geht, allerdings habe ich es tatsächlich so hinbekommen wie ich es eigentlich wollte:
Code:
  1.         public void BufferData<VertexFormat>(List<VertexFormat> Data)
  2.         {
  3.             gl.BufferData(gl.ARRAY_BUFFER_ARB, Marshal.SizeOf(Data), Data.ToArray(), gl.STATIC_DRAW_ARB);
  4.         }
  5.  
  6.         public void BufferData<VertexFormat>(VertexFormat[] Data)
  7.         {
  8.             gl.BufferData(gl.ARRAY_BUFFER_ARB, Marshal.SizeOf(Data), Data, gl.STATIC_DRAW_ARB);
  9.         }


Edit: Es scheint .NET wirklich schwerzufallen mein Konzept durchzulassen! :)

_________________
Shareholder und Leitender Entwickler bei Pipedream-Games.

Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 28, 2005 17:13 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
Nach zahlreichen Fehlern( Zum großen Teil unvorhergesehen ) bin ich an dem Punkt angelangt wo er mir nichts Zeichnet( Toll nicht? ) ausser einen Punkt beim Modus gl.POINTS( Noch toller? ):

Da ich das erste mal mit VBO's Arbeite( Mit den meisten Themen habe ich mich bisher nur Theoretisch beschäftigt ), glaube ich das ihr den Fehler vielleicht besser erkennt! Hier mal der Code meiner VBO Verwaltung:

Code:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using OpenGL.Header;
  5. using OpenGL.Device.nVertexBufferObject.CustomVertex;
  6. using System.Runtime.InteropServices;
  7.  
  8.  
  9. namespace OpenGL.Device.nVertexBufferObject
  10. {
  11.     class VertexBufferObject : IDisposable
  12.     {
  13.         private int xVBO;
  14.         private int xSize;
  15.         private int FSize;
  16.         private int xFormat;
  17.         public int VBO
  18.         {
  19.             get { return xVBO; }
  20.         }
  21.         public int Size
  22.         {
  23.             get { return xSize; }
  24.         }
  25.         public int Format
  26.         {
  27.             get { return xFormat; }
  28.         }
  29.         public int FormatSize
  30.         {
  31.             get { return FSize; }
  32.         }
  33.  
  34.         public VertexBufferObject()
  35.         {
  36.             xVBO = gl.GenBufferARB();
  37.         }
  38.  
  39.         public void Dispose()
  40.         {
  41.             gl.DeleteBuffersARB(1,new int[] {xVBO});
  42.         }
  43.  
  44.         public void BufferData<VertexFormat>(List<VertexFormat> Data, int pFormat, int pFormatSize)
  45.         {
  46.             FSize = pFormatSize;
  47.             this.xFormat = pFormat;
  48.             xSize = Data.Count - 1;
  49.             gl.BufferData(gl.ARRAY_BUFFER_ARB, FSize * Data.Count, Data.ToArray(), gl.STATIC_DRAW_ARB);
  50.         }
  51.  
  52.         public void BufferData<VertexFormat>(VertexFormat[] Data, int pFormat, int pFormatSize)
  53.         {
  54.             FSize = pFormatSize;
  55.             this.xFormat = pFormat;
  56.             xSize = Data.Length - 1;
  57.             gl.BufferData(gl.ARRAY_BUFFER_ARB, (Data.Length - 1)*FSize, Data, gl.STATIC_DRAW_ARB);
  58.         }
  59.     }
  60.  
  61.     public class VBOManager : IDisposable
  62.     {
  63.         private List<VertexBufferObject> VBOList;
  64.         private int ActiveBuffer;
  65.  
  66.         public VBOManager()
  67.         {
  68.             VBOList = new List<VertexBufferObject>();
  69.             gl.EnableClientState(gl.VERTEX_ARRAY);
  70.         }
  71.  
  72.         public void Dispose()
  73.         {
  74.             foreach (VertexBufferObject dVBO in this.VBOList)
  75.             {
  76.                 dVBO.Dispose();
  77.             }
  78.         }
  79.  
  80.         public int AddVBO()
  81.         {
  82.             VertexBufferObject tmpVBO = new VertexBufferObject();
  83.             VBOList.Add(tmpVBO);
  84.             return VBOList.Count - 1;
  85.         }
  86.  
  87.         public bool BufferData<VertexFormat>(int index, VertexFormat[] Data, int pFormat, int SizeFormat)
  88.         {
  89.             if (!(index + 1 > VBOList.Count))
  90.             {
  91.                 this.VBOList[index].BufferData<VertexFormat>(Data, pFormat, SizeFormat);
  92.                 return true;
  93.             }
  94.             else return false;
  95.         }
  96.  
  97.         public bool BufferData<VertexFormat>(int index, List<VertexFormat> Data, int pFormat, int SizeFormat)
  98.         {
  99.             if (!(index + 1 > VBOList.Count))
  100.             {
  101.                 this.VBOList[index].BufferData<VertexFormat>(Data, pFormat, SizeFormat);
  102.                 return true;
  103.             }
  104.             else return false;
  105.         }
  106.  
  107.  
  108.         public bool DrawVertexBufferObject(int index, int mode)
  109.         {
  110.             if (!(index + 1 > VBOList.Count))
  111.             {
  112.                 ActiveBuffer = index;
  113.                 gl.BindBufferARB(gl.ARRAY_BUFFER_ARB, VBOList[ActiveBuffer].VBO);
  114.                 gl.interleavedArrays(VBOList[ActiveBuffer].Format, VBOList[ActiveBuffer].FormatSize, 0);
  115.                 gl.DrawArrays(mode, 0, VBOList[ActiveBuffer].Size+1);
  116.                 return true;
  117.             }
  118.             else return false;
  119.         }
  120.     }
  121.  
  122. }


Und hier der Code wo ich mein VBO erstelle:
Code:
  1.         public void AddData()
  2.         {
  3.             MainVertexData = new Vertex_C4UB_V3F[4];
  4.             MainVertexData[1].r = MainVertexData[2].r = MainVertexData[0].r =
  5.             MainVertexData[1].g = MainVertexData[2].g = MainVertexData[0].g =
  6.             MainVertexData[1].b = MainVertexData[2].b = MainVertexData[0].b = 100;
  7.             MainVertexData[1].a = MainVertexData[2].a = MainVertexData[0].a = 255;
  8.             MainVertexData[3].a = MainVertexData[3].g = MainVertexData[3].r = MainVertexData[3].b = 255;
  9.  
  10.             MainVertexData[2].x = MainVertexData[2].y = MainVertexData[2].z =
  11.             MainVertexData[1].y = MainVertexData[1].z =
  12.             MainVertexData[0].x = MainVertexData[0].z = 0;
  13.             MainVertexData[1].x = 1; MainVertexData[0].y = 1;
  14.             MainVertexData[3].x = 1; MainVertexData[3].y = 1; MainVertexData[3].z = 0;
  15.  
  16.             Vertex_C4UB_V3F SizeTest;
  17.             SizeTest.x = SizeTest.y = SizeTest.z = SizeTest.a = SizeTest.r = SizeTest.g = SizeTest.b = 0;
  18.  
  19.             MainVBO = VertexBufferObjectList.AddVBO();
  20.             VertexBufferObjectList.BufferData(MainVBO, MainVertexData, gl.V3F, Marshal.SizeOf(SizeTest));
  21.         }


Zusätzlich wird noch in meiner Renderschleife aufgerufen:
Code:
  1.  
  2.             VertexBufferObjectList.DrawVertexBufferObject(MainVBO, gl.POINTS);
  3.             this.LastError = glu.ErrorString(gl.GetError());

Der Code ist natürlich nicht der Ganze! LastError ist immer Leer( Maybe, vielleicht funktioniert er auch nicht richtig? )!

_________________
Shareholder und Leitender Entwickler bei Pipedream-Games.

Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 28, 2005 18:43 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
Bei der Gelegenheit mal die Binarys als Anhang!

Sry das ich etwas nerve! :D
Aber will endlich das überhaupt was läuft! :(


EDIT: Endlich, es läuft, und dazu noch flott! Das Verwaltete rumspielen mit OpenGL macht auch jetzt schon richtig Spass!
Jetzt kommt -> FramebufferObject


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
Shareholder und Leitender Entwickler bei Pipedream-Games.

Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.


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 » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 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.008s | 15 Queries | GZIP : On ]