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

Aktuelle Zeit: Fr Jul 18, 2025 06:42

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



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Würfel in VBO
BeitragVerfasst: Mo Sep 03, 2007 20:20 
Offline
DGL Member

Registriert: Fr Aug 31, 2007 07:25
Beiträge: 12
Hallo!Hab nun einen Würfel mit Hilfe von Vertex Arrays dargestellt,würd jetzt gern das gleiche machen mit Vertex Buffer Object,aber weiss nicht wie es funktioniert!Hab mir zwar das Tutorial auf der Wiki Seite durchgelesen,aber kann es nicht auf den Würfel anwenden...Würd mich riesig über Hilfe freuen!!!
Hier mal das Programm,würd es gerne als Dateianhang machen,aber keine Ahnung wie...

Code:
  1. #include <windows.h>
  2. #include <math.h>
  3. #include <gl/gl.h>
  4. #include <gl/glu.h>
  5. #include <gl/glut.h>
  6. // Daten für den Würfel
  7. static GLfloat corners[] = { -25.0f, 25.0f, 25.0f, // 0 // Front of cube
  8.                               25.0f, 25.0f, 25.0f, // 1
  9.                               25.0f, -25.0f, 25.0f,// 2
  10.                              -25.0f, -25.0f, 25.0f,// 3
  11.                              -25.0f, 25.0f, -25.0f,// 4  // Back of cube
  12.                               25.0f, 25.0f, -25.0f,// 5
  13.                               25.0f, -25.0f, -25.0f,// 6
  14.                              -25.0f, -25.0f, -25.0f };// 7
  15.  
  16. // Index-Array um Würfel zu zeichnen
  17. static GLubyte indexes[] = { 0, 1, 2, 3,   // Front Face
  18.                              4, 5, 1, 0,    // Top Face
  19.                              3, 2, 6, 7,    // Bottom Face
  20.                              5, 4, 7, 6,    // Back Face
  21.                              1, 5, 6, 2,    // Right Face
  22.                              4, 0, 3, 7 }; // Left Face
  23. // Farb-Definition                           
  24. static GLfloat color[] =  {1.0f,0.0f,0.0f,
  25.                            1.0f,1.0f,0.0f,
  26.                            1.0f,0.0f,1.0f,
  27.                            0.0f,0.0f,0.0f,
  28.                            1.0f,0.0f,1.0f,
  29.                            0.0f,1.0f,1.0f,
  30.                            0.0f,0.0f,0.0f,
  31.                            1.0f,1.0f,1.0f};
  32.  
  33.  
  34. static GLfloat xRot = 0.0f;
  35. static GLfloat yRot = 0.0f;
  36.  
  37.  
  38.  
  39. // Called to draw scene
  40. void RenderScene(void)
  41.     {
  42.     // Clear the window with current clearing color
  43.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  44.  
  45.     // Make the cube a wire frame
  46.     //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  47.    
  48.     // Save the matrix state
  49.     glMatrixMode(GL_MODELVIEW);
  50.     glPushMatrix();
  51.     glTranslatef(0.0f, 0.0f, -200.0f);
  52.     glRotatef(xRot, 1.0f, 0.0f, 0.0f);
  53.     glRotatef(yRot, 0.0f, 0.0f, 1.0f);
  54.  
  55.     glEnableClientState(GL_VERTEX_ARRAY);
  56.     glEnableClientState(GL_COLOR_ARRAY);
  57.     glVertexPointer(3, GL_FLOAT, 0, corners);
  58.     glColorPointer(3, GL_FLOAT, 0, color);
  59.  
  60.     glDrawElements(GL_QUADS, 24, GL_UNSIGNED_BYTE, indexes);
  61.     glPopMatrix();
  62.     glDisableClientState(GL_VERTEX_ARRAY);
  63.     glDisableClientState(GL_COLOR_ARRAY);
  64.     // Swap buffers
  65.     glutSwapBuffers();
  66.     }
  67.  
  68.  
  69. // This function does any needed initialization on the rendering
  70. // context.
  71. void SetupRC()
  72.     {
  73.     // Black background
  74.     glClearColor(1.0f, 1.0f, 0.0f, 0.0f );
  75.     glEnable(GL_DEPTH_TEST);   
  76.     glEnable(GL_DITHER);
  77.     //glShadeModel(GL_FLAT);
  78.     //glColor3f(1,0,0);
  79.     }
  80.  
  81. ///////////////////////////////////////////////////////////////////////////////
  82. // Process arrow keys
  83. void SpecialKeys(int key, int x, int y)
  84.     {
  85.     if(key == GLUT_KEY_UP)
  86.         xRot-= 5.0f;
  87.  
  88.     if(key == GLUT_KEY_DOWN)
  89.         xRot += 5.0f;
  90.  
  91.     if(key == GLUT_KEY_LEFT)
  92.         yRot -= 5.0f;
  93.  
  94.     if(key == GLUT_KEY_RIGHT)
  95.         yRot += 5.0f;
  96.  
  97.     if(key > 356.0f)
  98.         xRot = 0.0f;
  99.  
  100.     if(key < -1.0f)
  101.         xRot = 355.0f;
  102.  
  103.     if(key > 356.0f)
  104.         yRot = 0.0f;
  105.  
  106.     if(key < -1.0f)
  107.         yRot = 355.0f;
  108.  
  109.     // Refresh the Window
  110.     glutPostRedisplay();
  111.     }
  112.  
  113.  
  114. void ChangeSize(int w, int h)
  115.     {
  116.     // Prevent a divide by zero
  117.     if(h == 0)
  118.         h = 1;
  119.  
  120.     // Set Viewport to window dimensions
  121.     glViewport(0, 0, w, h);
  122.  
  123.     // Reset coordinate system
  124.     glMatrixMode(GL_PROJECTION);
  125.     glLoadIdentity();
  126.  
  127.     // Establish clipping volume (left, right, bottom, top, near, far)
  128.     gluPerspective(35.0f, (float)w/(float)h, 1.0f, 1000.0f);
  129.  
  130.     glMatrixMode(GL_MODELVIEW);
  131.     glLoadIdentity();
  132.     }
  133.  
  134. int main(int argc, char* argv[])
  135.     {
  136.     glutInit(&argc, argv);
  137.  
  138.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  139.     glutInitWindowSize(800,600);
  140.     glutCreateWindow("Cube DX");
  141.     glutReshapeFunc(ChangeSize);
  142.     glutSpecialFunc(SpecialKeys);
  143.     glutDisplayFunc(RenderScene);
  144.  
  145.     SetupRC();
  146.  
  147.     glutMainLoop();
  148.     return 0;
  149.     }


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 04, 2007 12:37 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 07, 2006 13:37
Beiträge: 83
Wohnort: Partenheim
Hallo framueller,

da ich leider nicht weiß, an welcher Stelle des VBO-Tutorials du dich nicht mehr mit dem dort Beschriebenen und deinem bisherigen Code vereinbaren kannst, beschreib' ich grob den Übergabe- und den Render-Vorgang, wie er mit deinem Würfel aussähe.

Gehen wir also davon aus, du entscheidest dich für Variante 1 der Übergabe der Vertexdaten, wie es im VBO-Tutorial beschrieben ist. Du legst dir also, wenn du es nicht schon getan hast, ein TVertex-Objekt an, packst da in korrekter Reihenfolge (entspr. GL_T2F_V3F, ...) Textur-Koordinaten, Normalen, Farben und deine Koordinaten (corners) rein oder wie bei dir: Farben und Koordinaten. Den Rest machst du, wie im Tutorial beschrieben: Bei der Übergabe der Daten an die Grafikkarte kannst du dir nun überlegen, ob du lediglich nacheinander deine 8 Vertizen, oder ob du insgesamt die 6 Faces deines Würfels übergibst. Mit der ersten Methode sparst du Platz im Grafikkarten-RAM, mit der zweiten sparst du dir das Index-Array.

Hast du die Vertexdaten nach der ersten Methode übergeben, renderst du deinen Würfel via
Code:
  1. glInterleavedArrays(dein VertexFormat, ...);
  2. glDrawRangeElements(..., dein IndexArray);


Bei zweiter Methode genügt
Code:
  1. glInterleavedArrays(dein VertexFormat, ...);
  2. glDrawArrays(...);


Conan

_________________
THE TRUTH IS NOT OUT THERE!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 04, 2007 18:30 
Offline
DGL Member

Registriert: Fr Aug 31, 2007 07:25
Beiträge: 12
Oh sorry,ich bekomme es einfach nicht hin!Ist es nicht möglich,mit den von mir angelegten Arrays ganz schnell und einfach mit VBOs weiterzuarbeiten???

Grüße und dank für eure Hilfe
Frank


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 05, 2007 12:20 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 07, 2006 13:37
Beiträge: 83
Wohnort: Partenheim
Doch, das ist es ... :wink:
Wie gesagt, mit erster beschriebener Methode ändert sich nicht viel in deinem Code, da du ja das Index-Array schon vorliegen hast. Jedoch ist die zweite Methode in Sascha Willems VBO-Tutorial beschreiben.

Wo liegt denn genau dein Problem?
Kommt 'ne Fehlermeldung? Siehst du nur 'nen Teil des Würfels oder gar nichts?

Conan

_________________
THE TRUTH IS NOT OUT THERE!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 05, 2007 12:32 
Offline
DGL Member

Registriert: Fr Aug 31, 2007 07:25
Beiträge: 12
So,habe jetzt noch mal ausprobiert,einen Würfel mit vier verschiedenen Methoden zu übergeben und darzustellen!Wenn ich die VBOs ausklammern würde,dann klappt es,bei allen vier zeigt er mir Fehlermeldung bei Öffnen der exe an:-(
Hier mal der Code,hoffe mir sagt einer was ich falsch mache...ich bekomm es einfach nicht auf die Rolle...
Code:
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // main.cpp
  3. // ========
  4. // testing vertex array (glDrawElements, glDrawArray)
  5. //
  6. //  AUTHOR: Song Ho Ahn (song.ahn@gmail.com)
  7. // CREATED: 2005-10-04
  8. // UPDATED: 2005-10-28
  9. ///////////////////////////////////////////////////////////////////////////////
  10.  
  11. #include <GL/glut.h>
  12. #include "glext.h"
  13. #include <iostream>
  14. #include <sstream>
  15. #include <iomanip>
  16. using std::stringstream;
  17. using std::cout;
  18. using std::endl;
  19. using std::ends;
  20.  
  21.  
  22. // GLUT CALLBACK functions
  23. void displayCB();
  24. void reshapeCB(int w, int h);
  25. void timerCB(int millisec);
  26. void keyboardCB(unsigned char key, int x, int y);
  27. void mouseCB(int button, int stat, int x, int y);
  28. void mouseMotionCB(int x, int y);
  29.  
  30. void initGL();
  31. int  initGLUT(int argc, char **argv);
  32. bool initSharedMem();
  33. void clearSharedMem();
  34. void initLights();
  35. void setCamera(float posX, float posY, float posZ, float targetX, float targetY, float targetZ);
  36. void drawString(const char *str, int x, int y, float color[4], void *font);
  37. void drawString3D(const char *str, float pos[3], float color[4], void *font);
  38. void draw1();
  39. void draw2();
  40. void draw3();
  41. void draw4();
  42.  
  43. // global variables
  44. void *font = GLUT_BITMAP_8_BY_13;
  45. bool mouseLeftDown;
  46. bool mouseRightDown;
  47. bool mouseMiddleDown;
  48. float mouseX, mouseY;
  49. float cameraAngleX;
  50. float cameraAngleY;
  51. float cameraDistance;
  52. int drawMode = 0;
  53. int maxVertices;
  54. int maxIndices;
  55.  
  56. // function pointer to OpenGL extensions
  57. PFNGLDRAWRANGEELEMENTSPROC glDrawRangeElements = 0;
  58.  
  59.  
  60. // Würfel //
  61. //    v6----- v5
  62. //   /|      /|
  63. //  v1------v0|
  64. //  | |     | |
  65. //  | |v7---|-|v4
  66. //  |/      |/
  67. //  v2------v3
  68. // vertex array
  69. GLfloat vertices[] = {1,1,1,  -1,1,1,  -1,-1,1,  1,-1,1,        // v0-v1-v2-v3
  70.                       1,1,1,  1,-1,1,  1,-1,-1,  1,1,-1,        // v0-v3-v4-v5
  71.                       1,1,1,  1,1,-1,  -1,1,-1,  -1,1,1,        // v0-v5-v6-v1
  72.                       -1,1,1,  -1,1,-1,  -1,-1,-1,  -1,-1,1,    // v1-v6-v7-v2
  73.                       -1,-1,-1,  1,-1,-1,  1,-1,1,  -1,-1,1,    // v7-v4-v3-v2
  74.                       1,-1,-1,  -1,-1,-1,  -1,1,-1,  1,1,-1};   // v4-v7-v6-v5
  75. // normal array
  76. GLfloat normals[] = {0,0,1,  0,0,1,  0,0,1,  0,0,1,             // v0-v1-v2-v3
  77.                      1,0,0,  1,0,0,  1,0,0, 1,0,0,              // v0-v3-v4-v5
  78.                      0,1,0,  0,1,0,  0,1,0, 0,1,0,              // v0-v5-v6-v1
  79.                      -1,0,0,  -1,0,0, -1,0,0,  -1,0,0,          // v1-v6-v7-v2
  80.                      0,-1,0,  0,-1,0,  0,-1,0,  0,-1,0,         // v7-v4-v3-v2
  81.                      0,0,-1,  0,0,-1,  0,0,-1,  0,0,-1};        // v4-v7-v6-v5
  82. // color array
  83. GLfloat colors[] = {1,1,1,  1,1,0,  1,0,0,  1,0,1,              // v0-v1-v2-v3
  84.                     1,1,1,  1,0,1,  0,0,1,  0,1,1,              // v0-v3-v4-v5
  85.                     1,1,1,  0,1,1,  0,1,0,  1,1,0,              // v0-v5-v6-v1
  86.                     1,1,0,  0,1,0,  0,0,0,  1,0,0,              // v1-v6-v7-v2
  87.                     0,0,0,  0,0,1,  1,0,1,  1,0,0,              // v7-v4-v3-v2
  88.                     0,0,1,  0,0,0,  0,1,0,  0,1,1};             // v4-v7-v6-v5
  89. // index array of vertex array for glDrawElements()
  90. GLubyte indices[] = {0,1,2,3,
  91.                      4,5,6,7,
  92.                      8,9,10,11,
  93.                      12,13,14,15,
  94.                      16,17,18,19,
  95.                      20,21,22,23};
  96.  
  97. #ifdef _WIN32
  98. PFNGLGENBUFFERSARBPROC pglGenBuffersARB = 0;                     // VBO Name Generation Procedure
  99. PFNGLBINDBUFFERARBPROC pglBindBufferARB = 0;                     // VBO Bind Procedure
  100. PFNGLBUFFERDATAARBPROC pglBufferDataARB = 0;                     // VBO Data Loading Procedure
  101. PFNGLBUFFERSUBDATAARBPROC pglBufferSubDataARB = 0;               // VBO Sub Data Loading Procedure
  102. PFNGLDELETEBUFFERSARBPROC pglDeleteBuffersARB = 0;               // VBO Deletion Procedure
  103. PFNGLGETBUFFERPARAMETERIVARBPROC pglGetBufferParameterivARB = 0; // return various parameters of VBO
  104. PFNGLMAPBUFFERARBPROC pglMapBufferARB = 0;                       // map VBO procedure
  105. PFNGLUNMAPBUFFERARBPROC pglUnmapBufferARB = 0;                   // unmap VBO procedure
  106. #define glGenBuffersARB           pglGenBuffersARB
  107. #define glBindBufferARB           pglBindBufferARB
  108. #define glBufferDataARB           pglBufferDataARB
  109. #define glBufferSubDataARB        pglBufferSubDataARB
  110. #define glDeleteBuffersARB        pglDeleteBuffersARB
  111. #define glGetBufferParameterivARB pglGetBufferParameterivARB
  112. #define glMapBufferARB            pglMapBufferARB
  113. #define glUnmapBufferARB          pglUnmapBufferARB
  114. #endif
  115. ///////////////////////////////////////////////////////////////////////////////
  116. // draw 1, immediate mode
  117. // 54 calls = 24 glVertex*() calls + 24 glColor*() calls + 6 glNormal*() calls
  118. ///////////////////////////////////////////////////////////////////////////////
  119. void draw1()
  120. {
  121.     glPushMatrix();
  122.     glTranslatef(-2, 2, 0); // move to upper left corner
  123.     glBegin(GL_QUADS);
  124.         // face v0-v1-v2-v3
  125.         glNormal3f(0,0,1);
  126.         glColor3f(1,1,1);
  127.         glVertex3f(1,1,1);
  128.         glColor3f(1,1,0);
  129.         glVertex3f(-1,1,1);
  130.         glColor3f(1,0,0);
  131.         glVertex3f(-1,-1,1);
  132.         glColor3f(1,0,1);
  133.         glVertex3f(1,-1,1);
  134.  
  135.         // face v0-v3-v4-v6
  136.         glNormal3f(1,0,0);
  137.         glColor3f(1,1,1);
  138.         glVertex3f(1,1,1);
  139.         glColor3f(1,0,1);
  140.         glVertex3f(1,-1,1);
  141.         glColor3f(0,0,1);
  142.         glVertex3f(1,-1,-1);
  143.         glColor3f(0,1,1);
  144.         glVertex3f(1,1,-1);
  145.  
  146.         // face v0-v5-v6-v1
  147.         glNormal3f(0,1,0);
  148.         glColor3f(1,1,1);
  149.         glVertex3f(1,1,1);
  150.         glColor3f(0,1,1);
  151.         glVertex3f(1,1,-1);
  152.         glColor3f(0,1,0);
  153.         glVertex3f(-1,1,-1);
  154.         glColor3f(1,1,0);
  155.         glVertex3f(-1,1,1);
  156.  
  157.         // face  v1-v6-v7-v2
  158.         glNormal3f(-1,0,0);
  159.         glColor3f(1,1,0);
  160.         glVertex3f(-1,1,1);
  161.         glColor3f(0,1,0);
  162.         glVertex3f(-1,1,-1);
  163.         glColor3f(0,0,0);
  164.         glVertex3f(-1,-1,-1);
  165.         glColor3f(1,0,0);
  166.         glVertex3f(-1,-1,1);
  167.  
  168.         // face v7-v4-v3-v2
  169.         glNormal3f(0,-1,0);
  170.         glColor3f(0,0,0);
  171.         glVertex3f(-1,-1,-1);
  172.         glColor3f(0,0,1);
  173.         glVertex3f(1,-1,-1);
  174.         glColor3f(1,0,1);
  175.         glVertex3f(1,-1,1);
  176.         glColor3f(1,0,0);
  177.         glVertex3f(-1,-1,1);
  178.  
  179.         // face v4-v7-v6-v5
  180.         glNormal3f(0,0,-1);
  181.         glColor3f(0,0,1);
  182.         glVertex3f(1,-1,-1);
  183.         glColor3f(0,0,0);
  184.         glVertex3f(-1,-1,-1);
  185.         glColor3f(0,1,0);
  186.         glVertex3f(-1,1,-1);
  187.         glColor3f(0,1,1);
  188.         glVertex3f(1,1,-1);
  189.     glEnd();
  190.  
  191.     glPopMatrix();
  192. }
  193.  
  194. void draw2()
  195. {   glEnableClientState(GL_NORMAL_ARRAY);
  196.     glEnableClientState(GL_COLOR_ARRAY);
  197.     glEnableClientState(GL_VERTEX_ARRAY);
  198.     glNormalPointer(GL_FLOAT, 0, normals);
  199.     glColorPointer(3, GL_FLOAT, 0, colors);
  200.     glVertexPointer(3, GL_FLOAT, 0, vertices);
  201.  
  202.     glPushMatrix();
  203.     glTranslatef(2, 2, 0);                  
  204.  
  205.     glDrawArrays(GL_QUADS, 0, 24);
  206.  
  207.     glPopMatrix();
  208.  
  209.     glDisableClientState(GL_VERTEX_ARRAY);  
  210.     glDisableClientState(GL_COLOR_ARRAY);
  211.     glDisableClientState(GL_NORMAL_ARRAY);
  212. }
  213. void draw3()
  214. {
  215.     glEnableClientState(GL_NORMAL_ARRAY);
  216.     glEnableClientState(GL_COLOR_ARRAY);
  217.     glEnableClientState(GL_VERTEX_ARRAY);
  218.     glNormalPointer(GL_FLOAT, 0, normals);
  219.     glColorPointer(3, GL_FLOAT, 0, colors);
  220.     glVertexPointer(3, GL_FLOAT, 0, vertices);
  221.  
  222.     glPushMatrix();
  223.     glTranslatef(-2, -2, 0);                
  224.     glDrawElements(GL_QUADS, 24, GL_UNSIGNED_BYTE, indices);
  225.     glPopMatrix();
  226.     glDisableClientState(GL_VERTEX_ARRAY);
  227.     glDisableClientState(GL_COLOR_ARRAY);
  228.     glDisableClientState(GL_NORMAL_ARRAY);
  229. }
  230. void draw4()
  231. {       GLuint vboId = 0;    
  232.         glGenBuffersARB(1, &vboId);
  233.         glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboId);
  234.         glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(vertices)+sizeof(normals)+sizeof(colors), 0, GL_STATIC_DRAW_ARB);                                      // When buffer object is bound with its ID, all pointers in gl*Pointer()
  235.                                           // are treated as offset instead of real pointer.
  236.  
  237.         // enable vertex arrays
  238.         glEnableClientState(GL_NORMAL_ARRAY);
  239.         glEnableClientState(GL_COLOR_ARRAY);
  240.         glEnableClientState(GL_VERTEX_ARRAY);
  241.  
  242.         // before draw, specify vertex and index arrays with their offsets
  243.         glNormalPointer(GL_FLOAT, 0, (void*)sizeof(vertices));
  244.         glColorPointer(3, GL_FLOAT, 0, (void*)(sizeof(vertices)+sizeof(normals)));
  245.         glVertexPointer(3, GL_FLOAT, 0, 0);
  246.         glPushMatrix();
  247.         glTranslatef(-2, 2, 0);                
  248.         glDrawArrays(GL_QUADS, 0, 24);
  249.         glPopMatrix();
  250.         glDisableClientState(GL_VERTEX_ARRAY);  // disable vertex arrays
  251.         glDisableClientState(GL_COLOR_ARRAY);
  252.         glDisableClientState(GL_NORMAL_ARRAY);
  253.  
  254.         // it is good idea to release VBOs with ID 0 after use.
  255.         // Once bound with 0, all pointers in gl*Pointer() behave as real
  256.         // pointer, so, normal vertex array operations are re-activated
  257.         glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
  258.         glDeleteBuffersARB(1, &vboId);
  259. }
  260.  
  261.  
  262.  
  263.  
  264.  
  265. ///////////////////////////////////////////////////////////////////////////////
  266. int main(int argc, char **argv)
  267. {
  268.     initSharedMem();
  269.  
  270.     // init GLUT and GL
  271.     initGLUT(argc, argv);
  272.     initGL();
  273.  
  274.  
  275.     // check max of elements vertices and elements indices that your video card supports
  276.     // Use these values to determine the range of glDrawRangeElements()
  277.     // The constants are defined in glext.h
  278.     glGetIntegerv(GL_MAX_ELEMENTS_VERTICES, &maxVertices);
  279.     glGetIntegerv(GL_MAX_ELEMENTS_INDICES, &maxIndices);
  280.  
  281.     // get function pointer to glDrawRangeElements
  282.     glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC)wglGetProcAddress("glDrawRangeElements");
  283.  
  284.  
  285.     // the last GLUT call (LOOP)
  286.     // window will be shown and display callback is triggered by events
  287.     // NOTE: this call never return main().
  288.     glutMainLoop(); /* Start GLUT event-processing loop */
  289.  
  290.     return 0;
  291. }
  292.  
  293.  
  294.  
  295. ///////////////////////////////////////////////////////////////////////////////
  296. // initialize GLUT for windowing
  297. ///////////////////////////////////////////////////////////////////////////////
  298. int initGLUT(int argc, char **argv)
  299. {
  300.     // GLUT stuff for windowing
  301.     // initialization openGL window.
  302.     // it is called before any other GLUT routine
  303.     glutInit(&argc, argv);
  304.  
  305.     glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH | GLUT_STENCIL);   // display mode
  306.  
  307.     glutInitWindowSize(400, 300);               // window size
  308.  
  309.     glutInitWindowPosition(100, 100);           // window location
  310.  
  311.     // finally, create a window with openGL context
  312.     // Window will not displayed until glutMainLoop() is called
  313.     // it returns a unique ID
  314.     int handle = glutCreateWindow(argv[0]);     // param is the title of window
  315.  
  316.     // register GLUT callback functions
  317.     glutDisplayFunc(displayCB);
  318.     glutTimerFunc(100, timerCB, 100);             // redraw only every given millisec
  319.     glutReshapeFunc(reshapeCB);
  320.     glutKeyboardFunc(keyboardCB);
  321.     glutMouseFunc(mouseCB);
  322.     glutMotionFunc(mouseMotionCB);
  323.  
  324.     return handle;
  325. }
  326.  
  327.  
  328.  
  329. ///////////////////////////////////////////////////////////////////////////////
  330. // initialize OpenGL
  331. // disable unused features
  332. ///////////////////////////////////////////////////////////////////////////////
  333. void initGL()
  334. {
  335.     glShadeModel(GL_SMOOTH);                    // shading mathod: GL_SMOOTH or GL_FLAT
  336.     glPixelStorei(GL_UNPACK_ALIGNMENT, 4);      // 4-byte pixel alignment
  337.  
  338.     // enable /disable features
  339.     glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
  340.     //glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
  341.     //glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
  342.     glEnable(GL_DEPTH_TEST);
  343.     glEnable(GL_LIGHTING);
  344.     glEnable(GL_TEXTURE_2D);
  345.     glEnable(GL_CULL_FACE);
  346.  
  347.      // track material ambient and diffuse from surface color, call it before glEnable(GL_COLOR_MATERIAL)
  348.     glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
  349.     glEnable(GL_COLOR_MATERIAL);
  350.  
  351.     glClearColor(0, 0, 0, 0);                   // background color
  352.     glClearStencil(0);                          // clear stencil buffer
  353.     glClearDepth(1.0f);                         // 0 is near, 1 is far
  354.     glDepthFunc(GL_LEQUAL);
  355.  
  356.     initLights();
  357.     setCamera(0, 0, 10, 0, 0, 0);
  358. }
  359.  
  360.  
  361.  
  362. ///////////////////////////////////////////////////////////////////////////////
  363. // write 2d text using GLUT
  364. // The projection matrix must be set to orthogonal before call this function.
  365. ///////////////////////////////////////////////////////////////////////////////
  366. void drawString(const char *str, int x, int y, float color[4], void *font)
  367. {
  368.     glPushAttrib(GL_LIGHTING_BIT | GL_CURRENT_BIT); // lighting and color mask
  369.     glDisable(GL_LIGHTING);     // need to disable lighting for proper text color
  370.  
  371.     glColor4fv(color);          // set text color
  372.     glRasterPos2i(x, y);        // place text position
  373.  
  374.     // loop all characters in the string
  375.     while(*str)
  376.     {
  377.         glutBitmapCharacter(font, *str);
  378.         ++str;
  379.     }
  380.  
  381.     glEnable(GL_LIGHTING);
  382.     glPopAttrib();
  383. }
  384.  
  385.  
  386.  
  387. ///////////////////////////////////////////////////////////////////////////////
  388. // draw a string in 3D space
  389. ///////////////////////////////////////////////////////////////////////////////
  390. void drawString3D(const char *str, float pos[3], float color[4], void *font)
  391. {
  392.     glPushAttrib(GL_LIGHTING_BIT | GL_CURRENT_BIT); // lighting and color mask
  393.     glDisable(GL_LIGHTING);     // need to disable lighting for proper text color
  394.  
  395.     glColor4fv(color);          // set text color
  396.     glRasterPos3fv(pos);        // place text position
  397.  
  398.     // loop all characters in the string
  399.     while(*str)
  400.     {
  401.         glutBitmapCharacter(font, *str);
  402.         ++str;
  403.     }
  404.  
  405.     glEnable(GL_LIGHTING);
  406.     glPopAttrib();
  407. }
  408.  
  409.  
  410.  
  411. ///////////////////////////////////////////////////////////////////////////////
  412. // initialize global variables
  413. ///////////////////////////////////////////////////////////////////////////////
  414. bool initSharedMem()
  415. {
  416.     mouseLeftDown = mouseRightDown = mouseMiddleDown = false;
  417.  
  418.     return true;
  419. }
  420.  
  421.  
  422.  
  423. ///////////////////////////////////////////////////////////////////////////////
  424. // clean up shared memory
  425. ///////////////////////////////////////////////////////////////////////////////
  426. void clearSharedMem()
  427. {
  428. }
  429.  
  430.  
  431.  
  432. ///////////////////////////////////////////////////////////////////////////////
  433. // initialize lights
  434. ///////////////////////////////////////////////////////////////////////////////
  435. void initLights()
  436. {
  437.     // set up light colors (ambient, diffuse, specular)
  438.     GLfloat lightKa[] = {.2f, .2f, .2f, 1.0f};  // ambient light
  439.     GLfloat lightKd[] = {.7f, .7f, .7f, 1.0f};  // diffuse light
  440.     GLfloat lightKs[] = {1, 1, 1, 1};           // specular light
  441.     glLightfv(GL_LIGHT0, GL_AMBIENT, lightKa);
  442.     glLightfv(GL_LIGHT0, GL_DIFFUSE, lightKd);
  443.     glLightfv(GL_LIGHT0, GL_SPECULAR, lightKs);
  444.  
  445.     // position the light
  446.     float lightPos[4] = {0, 0, 20, 1}; // positional light
  447.     glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
  448.  
  449.     glEnable(GL_LIGHT0);                        // MUST enable each light source after configuration
  450. }
  451.  
  452.  
  453.  
  454. ///////////////////////////////////////////////////////////////////////////////
  455. // set camera position and lookat direction
  456. ///////////////////////////////////////////////////////////////////////////////
  457. void setCamera(float posX, float posY, float posZ, float targetX, float targetY, float targetZ)
  458. {
  459.     glMatrixMode(GL_MODELVIEW);
  460.     glLoadIdentity();
  461.     gluLookAt(posX, posY, posZ, targetX, targetY, targetZ, 0, 1, 0); // eye(x,y,z), focal(x,y,z), up(x,y,z)
  462. }
  463.  
  464.  
  465.  
  466. ///////////////////////////////////////////////////////////////////////////////
  467. // display info messages
  468. ///////////////////////////////////////////////////////////////////////////////
  469. void showInfo()
  470. {
  471.     // backup current model-view matrix
  472.     glPushMatrix();                     // save current modelview matrix
  473.     glLoadIdentity();                   // reset modelview matrix
  474.  
  475.     // set to 2D orthogonal projection
  476.     glMatrixMode(GL_PROJECTION);        // switch to projection matrix
  477.     glPushMatrix();                     // save current projection matrix
  478.     glLoadIdentity();                   // reset projection matrix
  479.     gluOrtho2D(0, 400, 0, 300);         // set to orthogonal projection
  480.  
  481.     float color[4] = {1, 1, 1, 1};
  482.  
  483.     stringstream ss;
  484.     ss << std::fixed << std::setprecision(3);
  485.  
  486.     ss << "Max Elements Vertices: " << maxVertices << ends;
  487.     drawString(ss.str().c_str(), 1, 286, color, font);
  488.     ss.str("");
  489.  
  490.     ss << "Max Elements Indices: " << maxIndices << ends;
  491.     drawString(ss.str().c_str(), 1, 272, color, font);
  492.     ss.str("");
  493.  
  494.     // unset floating format
  495.     ss << std::resetiosflags(std::ios_base::fixed | std::ios_base::floatfield);
  496.  
  497.     // restore projection matrix
  498.     glPopMatrix();                   // restore to previous projection matrix
  499.  
  500.     // restore modelview matrix
  501.     glMatrixMode(GL_MODELVIEW);      // switch to modelview matrix
  502.     glPopMatrix();                   // restore to previous modelview matrix
  503. }
  504.  
  505.  
  506.  
  507.  
  508.  
  509.  
  510. //=============================================================================
  511. // CALLBACKS
  512. //=============================================================================
  513.  
  514. void displayCB()
  515. {
  516.     // clear buffer
  517.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
  518.  
  519.     // save the initial ModelView matrix before modifying ModelView matrix
  520.     glPushMatrix();
  521.  
  522.     // tramsform camera
  523.     glTranslatef(0, 0, cameraDistance);
  524.     glRotatef(cameraAngleX, 1, 0, 0);   // pitch
  525.     glRotatef(cameraAngleY, 0, 1, 0);   // heading
  526.  
  527.     draw1();        // with immediate mode, glBegin()-glEnd() block
  528.     draw2();        // with glDrawArrays()
  529.     draw3();        // with glDrawElements()
  530.     draw4();        // with glDrawRangeElements()
  531.  
  532.  
  533.     // print 2D text
  534.     float pos[4] = {-4.0f,3.5f,0,1};
  535.     float color[4] = {1,1,1,1};
  536.     drawString3D("Ohne Array", pos, color, font);
  537.     pos[0] = 0.5f;
  538.     drawString3D("glDrawArrays()", pos, color, font);
  539.     pos[0] = -5.0f; pos[1] = -4.0f;
  540.     drawString3D("glDrawElements()", pos, color, font);
  541.     pos[0] = 0.5f;
  542.     drawString3D("VBO", pos, color, font);
  543.    
  544.  
  545.     showInfo();     // print max range of glDrawRangeElements
  546.  
  547.  
  548.     glPopMatrix();
  549.  
  550.     glutSwapBuffers();
  551. }
  552.  
  553.  
  554. void reshapeCB(int w, int h)
  555. {
  556.     // set viewport to be the entire window
  557.     glViewport(0, 0, (GLsizei)w, (GLsizei)h);
  558.  
  559.     // set perspective viewing frustum
  560.     float aspectRatio = (float)w / h;
  561.     glMatrixMode(GL_PROJECTION);
  562.     glLoadIdentity();
  563.     //glFrustum(-aspectRatio, aspectRatio, -1, 1, 1, 100);
  564.     gluPerspective(60.0f, (float)(w)/h, 1.0f, 1000.0f); // FOV, AspectRatio, NearClip, FarClip
  565.  
  566.     // switch to modelview matrix in order to set scene
  567.     glMatrixMode(GL_MODELVIEW);
  568. }
  569.  
  570.  
  571. void timerCB(int millisec)
  572. {
  573.     glutTimerFunc(millisec, timerCB, millisec);
  574.     glutPostRedisplay();
  575. }
  576.  
  577.  
  578. void keyboardCB(unsigned char key, int x, int y)
  579. {
  580.     switch(key)
  581.     {
  582.     case 27: // ESCAPE
  583.         clearSharedMem();
  584.         exit(0);
  585.         break;
  586.  
  587.     case 'd': // switch rendering modes (fill -> wire -> point)
  588.     case 'D':
  589.         drawMode = ++drawMode % 3;
  590.         if(drawMode == 0)        // fill mode
  591.         {
  592.             glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  593.             glEnable(GL_DEPTH_TEST);
  594.             glEnable(GL_CULL_FACE);
  595.         }
  596.         else if(drawMode == 1)  // wireframe mode
  597.         {
  598.             glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  599.             glDisable(GL_DEPTH_TEST);
  600.             glDisable(GL_CULL_FACE);
  601.         }
  602.         else                    // point mode
  603.         {
  604.             glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);
  605.             glDisable(GL_DEPTH_TEST);
  606.             glDisable(GL_CULL_FACE);
  607.         }
  608.         break;
  609.  
  610.     default:
  611.         ;
  612.     }
  613.     glutPostRedisplay();
  614. }
  615.  
  616.  
  617. void mouseCB(int button, int state, int x, int y)
  618. {
  619.     mouseX = x;
  620.     mouseY = y;
  621.  
  622.     if(button == GLUT_LEFT_BUTTON)
  623.     {
  624.         if(state == GLUT_DOWN)
  625.         {
  626.             mouseLeftDown = true;
  627.         }
  628.         else if(state == GLUT_UP)
  629.             mouseLeftDown = false;
  630.     }
  631.  
  632.     else if(button == GLUT_RIGHT_BUTTON)
  633.     {
  634.         if(state == GLUT_DOWN)
  635.         {
  636.             mouseRightDown = true;
  637.         }
  638.         else if(state == GLUT_UP)
  639.             mouseRightDown = false;
  640.     }
  641.  
  642.     else if(button == GLUT_MIDDLE_BUTTON)
  643.     {
  644.         if(state == GLUT_DOWN)
  645.         {
  646.             mouseMiddleDown = true;
  647.         }
  648.         else if(state == GLUT_UP)
  649.             mouseMiddleDown = false;
  650.     }
  651. }
  652.  
  653.  
  654. void mouseMotionCB(int x, int y)
  655. {
  656.     if(mouseLeftDown)
  657.     {
  658.         cameraAngleY += (x - mouseX);
  659.         cameraAngleX += (y - mouseY);
  660.         mouseX = x;
  661.         mouseY = y;
  662.     }
  663.     if(mouseRightDown)
  664.     {
  665.         cameraDistance += (y - mouseY) * 0.2f;
  666.         mouseY = y;
  667.     }
  668.  
  669.     glutPostRedisplay();
  670. }
  671.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 06, 2007 11:53 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 07, 2006 13:37
Beiträge: 83
Wohnort: Partenheim
Hallo Frank!

Ich bin nicht so sehr vertraut mit C++, daher kann ich dir nicht genau sagen, was mit deinem Code alles nicht stimmt, aber so einiges fällt mir da schon auf. :lol:

Die Initialisierung des VBOs würde ich z.B. nicht während des Renderns ausführen.
Ich hab' dir mal ein bisschen ungetesteten (es ist wohl eher Pseudo-) Code gebastelt.
Alle "<>"-Kommentare sind Platzhalter für entsprechenden C++-Code.
Ich hab' die Methode ohne IndexArray benutzt, da sie einfacher zu verstehen ist. Jeglicher, VBO-bezogener, Code ist hier enthalten. Beim Rendern sparst du dir also alle übrigen VBO-Funktionen wie glVertexPointer, glEnableClientState, ...

Viel Erfolg (davon gehe ich aus),
Conan


Code:
  1. struct TVertex;
  2. {
  3.   GLFloat ColR;
  4.   GLFloat ColG;
  5.   GLFloat ColB;
  6.   GLFloat ColA;
  7.   GLFloat NorX;
  8.   GLFloat NorY;
  9.   GLFloat NorZ;
  10.   GLFloat X;
  11.   GLFloat Y;
  12.   GLFloat Z;
  13. }
  14.  
  15.  
  16. int main()
  17. {
  18.   ...
  19.   // Create VBO:
  20.   glGenBuffersARB(1, @vboId);
  21.   // Bind VBO:
  22.   glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboId);
  23.   glEnableClientState(GL_VERTEX_ARRAY);
  24.   // Set VBOs size:
  25.   glBufferDataARB(GL_ARRAY_BUFFER_ARB, <SIZE>, nil, GL_STATIC_DRAW_ARB);
  26.   // Get Pointer to write into VBO:
  27.   VBOPointer = glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
  28.  
  29.  
  30.   <Create a Pointer to your TVertex (here: VertPointer)>
  31.  
  32.   // For each Face do ...
  33.   for (...)
  34.     // For each Face's Vertex do ...
  35.     for (...)
  36.     {
  37.       // Upload the VertexData into the VBO:
  38.       VertPointer      = VBOPointer;
  39.       VertPointer.ColR = <the "R"-Value of this Vertex' Color>
  40.       VertPointer.ColG = <the "G"-Value of this Vertex' Color>
  41.       VertPointer.ColB = <the "B"-Value of this Vertex' Color>
  42.       VertPointer.ColA = <the "A"-Value of this Vertex' Color>
  43.       VertPointer.NorX = <the "X"-Value of this Vertex' Normal>
  44.       VertPointer.NorY = <the "Y"-Value of this Vertex' Normal>
  45.       VertPointer.NorZ = <the "Z"-Value of this Vertex' Normal>
  46.       VertPointer.X    = <the "X"-Coord of this Vertex>
  47.       VertPointer.Y    = <the "Y"-Coord of this Vertex>
  48.       VertPointer.Z    = <the "Z"-Coord of this Vertex>
  49.  
  50.       <include VBOPointer by Size of TVertex (here: 40 bytes)>
  51.     }
  52.  
  53.   // Unmap, to enable VBO:
  54.   glUnMapBufferARB(GL_ARRAY_BUFFER_ARB);
  55. }
  56.  
  57.  
  58. void Draw()
  59. {
  60.   // Draw VBO:
  61.   glInterleavedArrays(GL_C4F_N3F_V3F, <Size Of TVertex (here: 40 bytes)>, nil);
  62.   glDrawArrays(GL_QUADS, 0, <Count of uploaded Vertices>);
  63. }

_________________
THE TRUTH IS NOT OUT THERE!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 07, 2007 13:38 
Offline
DGL Member

Registriert: Fr Aug 31, 2007 07:25
Beiträge: 12
Sorry,ich verstehe es nicht,liegt vielleicht aber auch daran,dass ich mit c++ programmiere...:-(((Hab jetzt mehrere Dinge probiert,aber es klappt nicht


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Sep 08, 2007 13:41 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 07, 2006 13:37
Beiträge: 83
Wohnort: Partenheim
Nicht aufgeben :wink:
Ich schick' mal 'nen Link zu diesem Thread an jemanden, der sich besser mit C++ auskennt.

Conan

_________________
THE TRUTH IS NOT OUT THERE!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Sep 08, 2007 16:52 
Offline
DGL Member

Registriert: Fr Aug 31, 2007 07:25
Beiträge: 12
super,sehr nett von dir!!!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 08, 2008 16:57 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
ups.

man bin ich blöd.

hab antworten statt neuer Thread geklickt.

Bitte löschen.

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 08, 2008 17:53 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Debugge doch erstmal das Programm um zu schauen, an welcher Stelle der Fehler auftritt

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Zuletzt geändert von Pellaeon am Di Jan 08, 2008 17:57, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 08, 2008 17:57 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Code:
  1. glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(vertices)+sizeof(normals)+sizeof(colors), 0, GL_STATIC_DRAW_ARB);


Du füllst das VBO garnicht. Da wo deine 0 steht kommt normalerweise der Zeiger auf die Daten hin. Oder du musst mappen und die Daten dann direkt in das VBO schreiben.

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


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


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.014s | 15 Queries | GZIP : On ]