Partikel in OpenGL
-
meine Partikel funktionieren, aber ich wollte sie nicht optimiren, weil ich denke, dass ich viel zu viel Rechenzeit verschwende. Hier mein quelltext.
void draw(){ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0,0,zoom); glRotatef(wrot,1,0,0); //Position der Kamera auf der Oberfläche eine imaginären Kugel, für optimale Sicht. glRotatef(zrot,0,1,0); for (int loop = 0; loop < maxParticles; loop++) { if ( particle[loop].active ){ GLfloat x = particle[loop].x; GLfloat y = particle[loop].y; GLfloat z = particle[loop].z; glColor4f(particle[loop].r, particle[loop].g, particle[loop].b, particle[loop].life); glPushMatrix(); glTranslatef(x,y,z); //Parikel Position glRotatef(-zrot,0,1,0); //rückgängig machen der Kameradrehungen, damit die Partikel alle in richtung Kamera sehen, und auch voll sichtbar sind. glRotatef(-wrot,1,0,0); //Wird für jeden Partikel einzeln gemacht. glBegin(GL_TRIANGLE_STRIP); glTexCoord2d(1,1); glVertex3f(+0.5f,+0.5f,0); glTexCoord2d(0,1); glVertex3f(-0.5f,+0.5f,0); glTexCoord2d(1,0); glVertex3f(+0.5f,-0.5f,0); glTexCoord2d(0,0); glVertex3f(-0.5f,-0.5f,0); glEnd(); glPopMatrix(); } } }Die Rotation richtung Kamera wird für jeden Partikel einzeln vorgenommen, allerdings habe ich das Gefühl, dass das auch besser geht, denn die Rotation ist ja für jeden Partikel die selbe. Wie kann ich das Optimieren? Ich hab hier auch ein Beispiel, in dem die mir sowas erklären wollten, aber das verstehe ich nicht, ich hab keine Ahnung was die da machen trotz kommentierung.
-
1. point sprites in erwaegung ziehen.
2. nicht pro partikel ein eigenes glBegin..glEnd
3. nicht pro partikel eine eigene matrix setzen (sondern die transformierten koordinaten in glVertex uebergeben).
4. die koordinaten nicht mehr im glVertex-Block uebergeben sondern direkt in VBO schreiben
-
Danke erstmal, aber wie kann ich die Koordinaten Transformieren, ich verstehen leider noch nicht wie ich das Machen soll, das es geht hab ich mir schon gedacht, aber wie ist mir weiterhin ein Rätsel.
-
-
Super link, danke, aber leide ist die Seite äusserst unvollständig, und ein Bestimmter Artikel wäre mir lieber. Die Grundlagen kenne ich ja, das haben wir in der Schule gemacht, nur Haben wir nir mit Matrizen gerechnet, wir hatten blos die Matrizen-Schreibweise für Gleichungssystheme, aber was die Mit der Matrix aus OpenGL zu tun hat, da hab ich keine Ahnung.
-
zum rotieren sollte dir sin/cos reichen. fuer simple particle waeren matritzen overpowered und was du da beim zeichnen anstellst, duerfte die performance einer wanderduene haben

mit helljobs 4punkte plan sollte es was werden, oder du nimmst 7kg ab

-
Ich hab mal angefangen, mit dem VBO, und hatte gehofft, das mich das weiterbringt, allerdings unterstützt mein System die nicht. Ich weiß allerdings nicht, ob das an der mangelhaften Treiberunterstützung von ATI liegt, oder an etwas anderem.
Also an alle, die ne Neue Grafikkarte haben wollen, und mit dem Gedanken Spielen Linux anwender zu werden, die Treiberunterstützung von ATI ist fürn *****, nehmt was anderes.
aber back to topic, ich hab immer noch kein blassen schimmer, wie das geht. SinCos ist mir Vertraut, Aber die Beschreibung ist mir absolut ein Rätsel, ich bin noch Anfänger in OpenGL, da helfen mir so Grobe richtlinien garnichts wenn es um etwas geht, was ich nicht kenne. Ich brauche ein kleinen Beispielcode, damit ich eine Blasse vorstellung davon bekomme, wie ihr denn gedenkt das umzusetzen.
Edit: Point Sprites werden auch nicht unterstützt.
-
VBO [...] unterstützt mein System nicht.
Wenn Deine Grafikkarte nicht aus dem letzten Jahrtausend stammt, dann geht das sogar mit ATI.
Schau mal in Deine glx.h, da gibt's 'ne Funktion namens glXGetProcAddressARB.
Da tust Du mal folgende Parameter rein:
"glGenBuffersARB", "glBindBufferARB", "glBufferDataARB", "glDeleteBuffersARB", "glMapBufferARB", "glUnmapBufferARB".
Und in die glext.h schauste auch mal rein.
Oder Du benutzt sowas.
Beispielsourcen gibt's dazu wohl auch genug, zb hier.
-
Ich benutze sowas: GLFW. Da gibt es folgende Möglichkeit:
#ifdef GL_ARB_vertex_buffer_object const int vbo_supported = glfwExtensionSupported("GL_ARB_vertex_buffer_object"); #else const int vbo_supported = GL_FALSE; #endif #ifdef GL_ARB_point_sprite const int ps_supported = glfwExtensionSupported("GL_ARB_point_sprite"); #else const int ps_supported = GL_FALSE; #endif //[...] cout << "Vertex Buffer Object: " << vbo_supported << endl; cout << "Point Sprite " << ps_supported << endl;Die Ausgabe:
Vertex Buffer Object: 0 Point Sprite 0und in meiner glx.h gibt's keine glXGetProcAddressARB, was soll denn das sein?
Hier mal eine Übersicht, was mit das Nehe tutorial 24 ausgibt:
Renderer ATI Radeon Xpress Series Vendor ATI Technologies Inc. Version 1.2 (2.0.6473 (8.37.6)) 1 GL_ARB_multitexture 2 GL_ARB_texture_border_clamp 3 GL_ARB_texture_cube_map 4 GL_ARB_texture_env_add 5 GL_ARB_texture_env_combine 6 GL_ARB_texture_env_dot3 7 GL_ARB_transpose_matrix 8 GL_EXT_abgr 9 GL_EXT_blend_colot 10 GL_EXT_blend_minmax 11 GL_EXT_blend_subtract 12 GL_EXT_texture_env_add 13 GL_EXT_texture_env_combine 14 GL_EXT_texture_env_dot3 15 GL_EXT_texture_lod_bias
-
Sehr uebersichtlich

Und Du hast auch bei ATI mal so'n Treiber runtergeladen?
-
ne, ich benutze das Tool von Ubuntu, das für diesen dienst zuständig ist. "Verwaltung eingeschränkter Treiber", ich hab gehört, das das Herunterladen von ATI nur eine Alternative zum selben ergebnis ist. Aber ich hab eine ATI Radeon Xpress 1100 dafür ist unter ati.com sowiso kein Treiber in der Liste, nur einer für die 200er und die 1250er Version.
-
Aber wenn das doch schon eingeschränkter Treiber heisst...
-
Ja in der Tat, die sind sehr eingeschränkt, aber die meinen ja doch blos, dass es nicht open source ist.
-
... meint bei NVIDIA z.b., dass es keine 3-d Beschleunigung gibt. Und wenn es das auch bei ATI heißt (was ich vermute), dann liegt die Lösung ja auf der Hand, oder?
-
mad_martin schrieb:
... meint bei NVIDIA z.b., dass es keine 3-d Beschleunigung gibt. Und wenn es das auch bei ATI heißt (was ich vermute), dann liegt die Lösung ja auf der Hand, oder?
Also ich spiel hier unter Linux auch 3D-Spiele (sowas wie Cod2 läuft sogar perfekt) unter Linux mit ner Geforce...
ATI ist da schlechter dran... (noch?)=> Infos: http://www.spielen-unter-linux.de
-
nvidia geht auf jeden fall besser, als ATI, aber irgendwie glaub ich das ich den Falschen treiber habe, denn auf der Seite von ATI steht:
Optimized Software Support
* ATI Catalyst
driver update support
* Microsoft
DirectX
9.0 and OpenGL
drivers
* Unified driver support or all ATI Radeon PCI Express discrete and integrated graphics products
* Support for Microsoft
Windows
XP, Windows
2000, and Linuxhttp://ati.amd.com/products/Radeonxpress1100mobintel/specs.html
diese daten lassen auf bessere leistung, als die gebotene Schließen.
-
Versuch ma fglrxinfo auf der Shell

Wenn du dann nicht sowas
$ fglrxinfo display: :0.0 screen: 0 OpenGL vendor string: Mesa project: www.mesa3d.org OpenGL renderer string: Mesa GLX Indirect OpenGL version string: 1.4 (2.1 Mesa 7.0.3)Bekommst hast du den AMD/ATI Treiber mit voller Leistung.
(Bei mir geht's nicht da der Kernel-Wrapper nicht für 2.6.25.1 compiliert
)
-
$ fglrxinfo display: :0.0 screen: 0 OpenGL vendor string: ATI Technologies Inc. OpenGL renderer string: ATI Radeon Xpress Series OpenGL version string: 2.0.6473 (8.37.6)=> Daraus schließen wir: ATI = Mist
-
langeweile schrieb:
mad_martin schrieb:
... meint bei NVIDIA z.b., dass es keine 3-d Beschleunigung gibt. Und wenn es das auch bei ATI heißt (was ich vermute), dann liegt die Lösung ja auf der Hand, oder?
Also ich spiel hier unter Linux auch 3D-Spiele (sowas wie Cod2 läuft sogar perfekt) unter Linux mit ner Geforce...
ATI ist da schlechter dran... (noch?)=> Infos: http://www.spielen-unter-linux.de
Ja, wenn du die proprietären Treiber nimmst. Die werden aber nicht in der Distri mitgegeben, sondern die muss sich der geneigte User selbst installieren. Und wenn man das nicht weiß, wundert man sich trotz richtiger Erkennung der Karte durchs System über mangelnde Leistung

-
Ja, das ist aber besser, als Garkein 3D ohne Proprientären Treiber, und mit Treiber extrem schlechte performance und kaum extention support, ich hab grad noch mal unter windows nehe lesson22 gestartet, und da sieht die Sache schon ganz anders aus:
Renderer: ATI RADEON XPRESS 1100 x86/SSE2 Vendor: ATI TECHNOLOGOES INC Version: 2.0.6645 WinXP Release insgesamt 91 extentionsDas sieht ganz anders aus, aber unter Windows will ich nicht Programmieren.