OpenGL VBO не отображается

У меня проблемы с рисованием в VBO. Используя немедленный режим, я могу легко нарисовать кубическую сетку точек, но это довольно медленно. Я хотел использовать VBO, чтобы попытаться ускорить рисование. Я использую SDL/glew. Мой вывод - одна черная точка. Тот же код установки sdl/glew работал для текстурированных треугольников, но не использовал структуру для хранения данных — мне нужна структура для целей кэширования, поэтому цвет вершины близок к положению вершины.

для настройки sdl/glew:

if (SDL_Init(SDL_INIT_VIDEO) < 0) {
    lm->Log(LogManager::Error, "Video initialization failed: " + std::string(SDL_GetError()));
    return false;
}

const SDL_VideoInfo *videoInfo;
videoInfo = SDL_GetVideoInfo();

if (!videoInfo) {
    lm->Log(LogManager::Error, "Video query failed: " + std::string(SDL_GetError()));
    return false;
}

int videoFlags;
videoFlags = SDL_OPENGL;
videoFlags |= SDL_GL_DOUBLEBUFFER;
videoFlags |= SDL_HWPALETTE;
videoFlags |= SDL_RESIZABLE;
videoFlags |= SDL_FULLSCREEN;

if (videoInfo->hw_available) {
    videoFlags |= SDL_HWSURFACE;
} else {
    videoFlags |= SDL_SWSURFACE;
}

if (videoInfo->blit_hw) {
    videoFlags |= SDL_HWACCEL;
}

SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 0);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);

int scrWidth = 1280, scrHeight = 800;
GLfloat aspectRatio = (GLfloat) scrWidth / (GLfloat) scrHeight;
*surface = SDL_SetVideoMode(scrWidth, scrHeight, 32, videoFlags);

if (!*surface) {
    lm->Log(LogManager::Error, "Video mode set failed: " + std::string(SDL_GetError()));
    return false;
}

glewInit();

if (!glewIsSupported("GL_VERSION
struct Vertex {
    GLfloat position[3];
    GLfloat colour[3];
};
... // then in the init function
verts = new Vertex[numVerts];
... // fill verts
vboId = 0;
glGenBuffers(1, &vboId);
glBindBuffer(GL_ARRAY_BUFFER, vboId);
glBufferData(GL_ARRAY_BUFFER, sizeof (verts), &verts[0], GL_STATIC_DRAW);

glVertexPointer(3, GL_FLOAT, sizeof (Vertex), (GLvoid*) offsetof(Vertex, position));
glColorPointer(3, GL_FLOAT, sizeof (Vertex), (GLvoid*) offsetof(Vertex, colour));
delete [] verts;
0")) { lm->Log(LogManager::Error, "OpenGL 2.0 not available"); return false; } glViewport(0, 0, (GLsizei) scrWidth, (GLsizei) scrHeight); // Set the viewport glMatrixMode(GL_PROJECTION); // Set the Matrix mode glLoadIdentity(); gluPerspective(75, aspectRatio, 0.1, 100.0); glMatrixMode(GL_MODELVIEW); glPointSize(5); glEnable(GL_DEPTH_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

сделать ВБО:

struct Vertex {
    GLfloat position[3];
    GLfloat colour[3];
};
... // then in the init function
verts = new Vertex[numVerts];
... // fill verts
vboId = 0;
glGenBuffers(1, &vboId);
glBindBuffer(GL_ARRAY_BUFFER, vboId);
glBufferData(GL_ARRAY_BUFFER, sizeof (verts), &verts[0], GL_STATIC_DRAW);

glVertexPointer(3, GL_FLOAT, sizeof (Vertex), (GLvoid*) offsetof(Vertex, position));
glColorPointer(3, GL_FLOAT, sizeof (Vertex), (GLvoid*) offsetof(Vertex, colour));
delete [] verts;

рисовать:

glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);

glVertexPointer(3, GL_FLOAT, sizeof (Vertex), (GLvoid*) offsetof(Vertex, position));
glColorPointer(3, GL_FLOAT, sizeof (Vertex), (GLvoid*) offsetof(Vertex, colour));

glDrawArrays(GL_POINTS, 0, numVerts);

glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);

person Zeophlite    schedule 26.12.2010    source источник
comment
Также я считаю, что моя структура Vertex должна иметь элемент char padding[n]; где n делает sizeof(Vertex) хорошим числом. Что приятно?   -  person Zeophlite    schedule 26.12.2010


Ответы (1)


Этот:

glBufferData(GL_ARRAY_BUFFER, sizeof (verts), &verts[0], GL_STATIC_DRAW);

Должно быть:

glBufferData(GL_ARRAY_BUFFER, sizeof (Vertex)*numVerts, &verts[0], GL_STATIC_DRAW);

Оригинал просто дал вам размер указателя, а не размер массива. Это объясняет единственную точку, но я не уверен, почему вы видите замедление.

person ergosys    schedule 26.12.2010
comment
Спасибо, ergosys, ускорение, о котором я говорил, было немедленным по сравнению с VBO. - person Zeophlite; 26.12.2010