[OpenGL] Problem z wyświetlaniem obiektów za pomocą VBO 5437 9

O temacie

Autor Adanos

Zaczęty 29.10.2011 roku

Wyświetleń 5437

Odpowiedzi 9

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Otóż mam problem z poniższym kodem. Większość wziąłem stąd: http://en.wikipedia.org/wiki/Vertex_Buffer_Object. Problem polega na tym, że po prostu wywala mi "Wystąpił problem z aplikacją test.exe i zostanie ona zamknięta." Z tego co zauważyłem problem pojawia się już przy generowaniu bufora GenBuffers(1, &triangleVBO);. Ktoś ma pojęcie, co robię źle i zechciałby mi pomóc?
#include <iostream>
#include <GL/gl.h>
#include <GL/glu.h>
#include <SDL/SDL.h>
#include <Gl/glext.h>

#define GL_ARRAY_BUFFER 0x8892
#define GL_STATIC_DRAW 0x88E4
typedef void (APIENTRY * PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer);
typedef void (APIENTRY * PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers);
typedef void (APIENTRY * PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers);
typedef void (APIENTRY * PFNGLBUFFERDATAARBPROC) (GLenum target, int size, const GLvoid *data, GLenum usage);

PFNGLGENBUFFERSARBPROC GenBuffers = NULL; // VBO Name Generation Procedure
PFNGLBINDBUFFERARBPROC BindBuffer = NULL; // VBO Bind Procedure
PFNGLBUFFERDATAARBPROC BufferData= NULL; // VBO Data Loading Procedure
PFNGLDELETEBUFFERSARBPROC DeleteBuffers = NULL;

int main(int argc,char *argv[])
{
   int zakoncz = 0;
   int i = 0;
   SDL_SetVideoMode(800, 600, 32, SDL_OPENGL|SDL_RESIZABLE);
   glViewport(0, 0, 800, 600);

   GLuint triangleVBO;
   const float NUM_OF_VERTICES_IN_DATA=3;

   float data[3][3] = { {0.0, 1.0, 0.0},
                        {-1.0, -1.0, 0.0},
                        {1.0, -1.0, 0.0}};

   GenBuffers(1, &triangleVBO);

   BindBuffer(GL_ARRAY_BUFFER, triangleVBO);

   BufferData(GL_ARRAY_BUFFER, NUM_OF_VERTICES_IN_DATA * 3 * sizeof(float), data, GL_STATIC_DRAW);

   BindBuffer(GL_ARRAY_BUFFER, triangleVBO);

   glClearColor(0.0, 0.0, 0.0, 1.0);

   glClear(GL_COLOR_BUFFER_BIT);

   glDrawArrays(GL_TRIANGLES, 0, 3);

   SDL_Event zdarzenie;

   glColor3f(0.0f, 0.0f, 0.0f); //czarny

   while (!zakoncz)
   {
      SDL_GL_SwapBuffers();

      while (SDL_PollEvent(&zdarzenie))
      {
         switch (zdarzenie.type)
         {
            case SDL_VIDEORESIZE:
               SDL_SetVideoMode(zdarzenie.resize.w, zdarzenie.resize.h,
                              32, SDL_OPENGL|SDL_RESIZABLE);
               glViewport(0, 0, zdarzenie.resize.w, zdarzenie.resize.h);
               break;

            case SDL_QUIT:
               zakoncz = 1;
               break;
            default:
               break;
         }
      }
   }

   return 0;
}

muttley

muttley

Użytkownicy
posty567
Propsy381
  • Użytkownicy
Nie znam się na C++, ale może trzeba coś przypisać do triangleVBO

@Edit
PFNGLGENBUFFERSARBPROC GenBuffers = NULL;WTF? Wątpię, że to będzie działać jak jest null.
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Nie znam się na C++, ale może trzeba coś przypisać do triangleVBO

@Edit
PFNGLGENBUFFERSARBPROC GenBuffers = NULL;WTF? Wątpię, że to będzie działać jak jest null.
Problem jest właśnie z tymi funkcjami GenBuffers, BindBuffer, BufferData, DeleteBuffers. Niby je dołączam, ale kompilator ich nie widzi :blink:  Nie mam pojęcia czemu. Skopiowałem nawet definicję z SDL_opengl.h, ale wywala undefined reference to `glGenBuffers(int, unsigned int*)@8#msg1010245|Google milczy na ten temat.

glGenBuffers to to samo, co GenBuffers.

muttley

muttley

Użytkownicy
posty567
Propsy381
  • Użytkownicy
Znalazłem w sieci takie linijki
glBindBufferARB = (PFNGLBINDBUFFERARBPROC)wglGetProcAddress("glBindBufferARB");
glGenBuffersARB = (PFNGLGENBUFFERSARBPROC)wglGetProcAddress("glGenBuffersARB");
glBufferDataARB = (PFNGLBUFFERDATAARBPROC)wglGetProcAddress("glBufferDataARB");

Pokombinuj z tym

@Edit
http://kickingdragon.com/2006/07/25/opengl-vertex-buffer-objects-tutorial/
 


Zysk

Zysk

Użytkownicy
posty606
Propsy451
  • Użytkownicy
kompilator je widzi... linker nie.

używaj odpowiednich bibliotek.

sam nagłówek nie wystaczy.

http://stackoverflow.com/questions/3032386/glgenbuffers-not-defined
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
No tak, ale wydaje mi się, że mam odpowiednie biblioteki. Dodałem... SDL_Init( SDL_INIT_VIDEO ); i wywala mi Process returned 3 (0x3) i zamyka się. Wiem, że powinienem to dać od razu, ale dalej nie działa. Użycie glew też nic nie zmienia.

#include <iostream>
#include <SDL/SDL.h>
#include <SDL/SDL_opengl.h>

typedef void (APIENTRY * PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer);
typedef void (APIENTRY * PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers);
typedef void (APIENTRY * PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers);
typedef void (APIENTRY * PFNGLBUFFERDATAARBPROC) (GLenum target, int size, const GLvoid *data, GLenum usage);

PFNGLGENBUFFERSARBPROC GenBuffers = NULL; // VBO Name Generation Procedure
PFNGLBINDBUFFERARBPROC BindBuffer = NULL; // VBO Bind Procedure
PFNGLBUFFERDATAARBPROC BufferData= NULL; // VBO Data Loading Procedure
PFNGLDELETEBUFFERSARBPROC DeleteBuffers = NULL;

int main(int argc,char *argv[])
{
   int zakoncz = 0;
   int i = 0;
   SDL_Init( SDL_INIT_VIDEO );
   SDL_SetVideoMode(800, 600, 32, SDL_OPENGL|SDL_RESIZABLE);
   glViewport(0, 0, 800, 600);

   GLuint triangleVBO;
   const float NUM_OF_VERTICES_IN_DATA=3;

   float data[3][3] = { {0.0, 1.0, 0.0},
                        {-1.0, -1.0, 0.0},
                        {1.0, -1.0, 0.0}};

   GenBuffers(1, &triangleVBO);

   BindBuffer(GL_ARRAY_BUFFER, triangleVBO);

   BufferData(GL_ARRAY_BUFFER, NUM_OF_VERTICES_IN_DATA * 3 * sizeof(float), data, GL_STATIC_DRAW);

   BindBuffer(GL_ARRAY_BUFFER, triangleVBO);

   glClearColor(0.0, 0.0, 0.0, 1.0);

   glClear(GL_COLOR_BUFFER_BIT);

   glDrawArrays(GL_TRIANGLES, 0, 3);

   SDL_Event zdarzenie;

   glColor3f(0.0f, 0.0f, 0.0f); //czarny

   while (!zakoncz)
   {
      SDL_GL_SwapBuffers();

      while (SDL_PollEvent(&zdarzenie))
      {
         switch (zdarzenie.type)
         {
            case SDL_VIDEORESIZE:
               SDL_SetVideoMode(zdarzenie.resize.w, zdarzenie.resize.h,
                              32, SDL_OPENGL|SDL_RESIZABLE);
               glViewport(0, 0, zdarzenie.resize.w, zdarzenie.resize.h);
               break;

            case SDL_QUIT:
               zakoncz = 1;
               break;
            default:
               break;
         }
      }
   }

   return 0;
}

Linker:
http://imageshack.us/photo/my-images/543/sdlg.jpg/

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Ok, jest mały sukces. Nie wywala mi żadnego błędu. Ale nic nie widzę, żeby rysowało. Mam tylko czarny ekran. Uporządkowałem definicje tych glGenBuffers.

#include <iostream>
#include <SDL/SDL.h>
#include <SDL/SDL_opengl.h>

typedef void (APIENTRY * PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer);
typedef void (APIENTRY * PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers);
typedef void (APIENTRY * PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers);
typedef void (APIENTRY * PFNGLBUFFERDATAPROC) (GLenum target, int size, const GLvoid *data, GLenum usage);

PFNGLGENBUFFERSPROC glGenBuffers = NULL; // VBO Name Generation Procedure
PFNGLBINDBUFFERPROC glBindBuffer = NULL; // VBO Bind Procedure
PFNGLBUFFERDATAPROC glBufferData= NULL; // VBO Data Loading Procedure
PFNGLDELETEBUFFERSPROC glDeleteBuffers = NULL;

int main(int argc,char *argv[])
{
   int zakoncz = 0;
   int i = 0;
   SDL_Init(SDL_INIT_VIDEO);
   SDL_SetVideoMode(800, 600, 32, SDL_OPENGL|SDL_RESIZABLE);
   glViewport(0, 0, 800, 600);

   GLuint triangleVBO=0;

   const float NUM_OF_VERTICES_IN_DATA=3;

   float data[3][3] = { {0.0, 1.0, 0.0},
                        {-1.0, -1.0, 0.0},
                        {1.0, -1.0, 0.0}};

   SDL_Event zdarzenie;

   glGenBuffers = (PFNGLGENBUFFERSPROC)SDL_GL_GetProcAddress("glGenBuffers");
   glBindBuffer=(PFNGLBINDBUFFERPROC)SDL_GL_GetProcAddress("glBindBuffer"); // VBO Bind Procedure
   glBufferData=(PFNGLBUFFERDATAPROC)SDL_GL_GetProcAddress("glBufferData"); // VBO Data Loading Procedure
   glDeleteBuffers=(PFNGLDELETEBUFFERSPROC)SDL_GL_GetProcAddress("glDeleteBuffers");

   glGenBuffers(1, &triangleVBO); //tu jest b³¹d
   //std::cout << SDL_GetError();
   //glGetError();
   //std::cout << glGetError();
   glBindBuffer(GL_ARRAY_BUFFER_ARB, triangleVBO);
   glBufferData(GL_ARRAY_BUFFER_ARB, NUM_OF_VERTICES_IN_DATA*9*sizeof(double), &data[0][0], GL_STATIC_DRAW_ARB);

   glEnableClientState(GL_VERTEX_ARRAY);
   glVertexPointer(3, GL_FLOAT, 0, &data[0][0]);
   //glClearColor(1.0, 0.0, 0.0, 1.0);
   glColor3f(0.0f, 1.0f, 0.0f);
   glDrawArrays(GL_TRIANGLES,0,3);

   //glDisableClientState(GL_VERTEX_ARRAY);

   //glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
   glDeleteBuffers(1, &triangleVBO);

   while (!zakoncz)
   {
      SDL_GL_SwapBuffers();

      while (SDL_PollEvent(&zdarzenie))
      {
         switch (zdarzenie.type)
         {
            case SDL_VIDEORESIZE:
               SDL_SetVideoMode(zdarzenie.resize.w, zdarzenie.resize.h,
                              32, SDL_OPENGL|SDL_RESIZABLE);
               glViewport(0, 0, zdarzenie.resize.w, zdarzenie.resize.h);
               break;

            case SDL_QUIT:
               zakoncz = 1;
               break;
            default:
               break;
         }
      }
   }

   return 0;
}

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Ok. Już mi działa :D  OpenGL 3.x wymaga użycia, razem z VBO, VAO. Na potwierdzenie screen:

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Wreszcie udało mi się uzyskać w miarę porządny obraz.

Pozostaje oczywiście jeszcze ustawienie kolorów, materiałów, kamery etc.


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry