2014-02-15 6 views
2

Im не удается нарисовать с помощью VBO.OpenGL простая проблема с VBO

Iv использовал этот код для рисования с использованием массива вершин, но когда я пытаюсь поместить его в vbo и нарисую его, я получаю пустой белый экран.

Iv попытался добавить инициализацию vbo к функции glutinit, но это вызывает разрыв. Iv также попытался вызвать инициализацию VBO в отдельном func только один раз, чтобы увидеть, вызвало ли несколько раз VBO проблему, и iv также лишил мой proj просто для того, чтобы показать это, чтобы увидеть, будет ли это работать; но, увы, им все еще наступают козыри с белым экраном.

  • просто примечание, я читал, что это может быть проблемой, чтобы сделать с моими драйверов карт не поддерживает> OGL 2.0 (зная мою удачу там нет ничего плохого в моем коде, и это так)

    float f[] = {0, 2, -4, -2, -2, -4, 2, -2, -4}; 
    GLuint vbo; 
    
    void DisplayGL() // the update display callback? 
    { 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear out the stuff from the old window.  
    
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    
    //translate and rotate SWAP X AND Y DERP 
    glRotatef(camera->rot.x, 0.0f, 1.0f, 0.0f); // deg, xflag, yflag, zflag 
    glRotatef(camera->rot.y, 1.0f, 0.0f, 0.0f); // deg, xflag, yflag, zflag 
    glTranslatef(camera->pos.x, camera->pos.y, camera->pos.z); // move us back a bit 
    
    glGenBuffers(1, &vbo); // make a buffer 
    glBindBuffer(GL_ARRAY_BUFFER, vbo); // bind the buffer - type, buffer add 
    glBufferData(GL_ARRAY_BUFFER, sizeof(f), f, GL_STATIC_DRAW); //type, size of the data, the data, flag (GL_A_B) 
    
    glBindBuffer(GL_ARRAY_BUFFER, vbo); // rebind? 
    
    glEnableClientState(GL_VERTEX_ARRAY); // enable the client state 
    
    glVertexPointer(3, GL_FLOAT, sizeof(float), 0); // how may elemets per vertex, data type, how many bytes between vertex, starting point of data 
    
    glDrawArrays(GL_TRIANGLES, 0, 3); // draw type, starting point (vertex), how many vertex 
    
    glDisableClientState(GL_VERTEX_ARRAY); // disable the client state 
    
    // render some text 
    std::string text = "Mouse x, y: " + std::to_string(testx) + ", " + std::to_string(testy); 
    drawText(text.data(), text.length(), 0, 575); 
    
    text = "Cam x, y rotation: " + std::to_string(camera->rot.x) + ", " + std::to_string(camera->rot.y); 
    drawText(text.data(), text.length(), 0, 560); 
    
    glutSwapBuffers(); // swap our active buffer to our unactive buffer 
    

    }

-он другой быстрый вопрос, а им в этом, я использую GLM (OpenGL математике ОМТ). Мне было интересно, можно ли использовать вектор glm :: vec3 вместо массива или вектора поплавков. И если это может быть, есть ли что-то особенное, вам нужно сказать openGL, чтобы он использовал данные внутри datatype glm :: vec3? я только спросить, так как его данные с в структуры и доступ, как это с в цикле (*i).x ... и т.д., не доступный как стандартный массив или вектор поплавков, как: (*i)

Edit-

Вот раздели вниз основном с вопросом:

#include <iostream> 
#include <vector> 

#include "..\..\externals\glm\glm\glm.hpp" // openGL Math header. 
#include <gl/glew.h> // include glew depend's 
#define FREEGLUT_STATIC  // defign the lib for glut 
#include <gl/freeglut.h> // include glut 

int g_iWindowWidth = 800; // our global window width and height 
int g_iWindowHeight = 600; 

int g_hWindowHandle = 0; // out handler for our main window 

void initGLUT(int argc, char* argv[]); // the initalise func for glut 

//call back funcs 
void DisplayGL(); // the update display func callback's 
void IdleGL(); // idle function 

GLuint vbo; 
std::vector<glm::vec3> verts; 

void makeVbo(); 

int main(int argc, char* argv[]) 
{ 
    verts.push_back(glm::vec3(0, 2, -4)); 
    verts.push_back(glm::vec3(-2, -2, -4)); 
    verts.push_back(glm::vec3(2, -2, -4)); 

    initGLUT(argc, argv); // initalise glut 
    makeVbo(); // ***no matter where this is placed, i get a break or a white screen?*** 
    glutMainLoop(); // run our grafix 
} 

void initGLUT(int argc, char* argv[]) 
{ 
    glutInit(&argc, argv); // initalise the widow with out global params 

    glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_CONTINUE_EXECUTION); // when we close the window return to the main func or previous func 

    int iScreenWidth = glutGet(GLUT_SCREEN_WIDTH); // our window W and H 
    int iScreenHeight = glutGet(GLUT_SCREEN_HEIGHT); 

    glutInitDisplayMode(GLUT_RGBA | GLUT_ALPHA | GLUT_DOUBLE | GLUT_DEPTH); // rgb with alpha and a depth to our view 

    glutInitWindowPosition((iScreenWidth - g_iWindowWidth)/2, (iScreenHeight - g_iWindowHeight)/2); // set the window pos on screen 
    glutInitWindowSize(g_iWindowWidth, g_iWindowHeight); // windwow size 

    g_hWindowHandle = glutCreateWindow("My OpenGL Template!"); // title & our window_H 

    glutDisplayFunc(DisplayGL); // bind callback functions 
    glutIdleFunc(IdleGL); 

    glEnable(GL_DEPTH_TEST); 
} 

void DisplayGL() // the update display func callback? 
{ 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear out the stuff from the old window. 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    //translate 

    glTranslatef(0, 0,-6); // move us back a bit 

    glEnableClientState(GL_VERTEX_ARRAY); 

    glBindBuffer(GL_ARRAY_BUFFER, vbo); 
    glVertexPointer(3, GL_FLOAT, 0, 0); 

    glDrawArrays(GL_TRIANGLES, 0, 3); 

    glDisableClientState(GL_VERTEX_ARRAY); 

    glutSwapBuffers(); // swap our active buffer to our unactive buffer 
} 
void IdleGL() // logic here 
{ 
    glutPostRedisplay(); // redrawwindow 
} 
void makeVbo() 
{ 
    glGenBuffers(1, &vbo); 
    glBindBuffer(GL_ARRAY_BUFFER, vbo); 
    glBufferData 
     (
     GL_ARRAY_BUFFER, 
     sizeof(glm::vec3) * verts.size(), 
     &verts[0], 
     GL_STATIC_DRAW 
     ); 
} 

Edit 2- Been на весь день, глядя вокруг и возился. кажется, много комментариев говорят, чтобы вызвать glewinit(); перед тем, как сделать vbo, чтобы убедиться, что указатели вызовов gl верны.

void makeVbo() 
{ 

    glewInit(); 
    glGenBuffers(1, &vbo); 
    glBindBuffer(GL_ARRAY_BUFFER, vbo); 
    glBufferData 
     (
     GL_ARRAY_BUFFER, 
     sizeof(glm::vec3) * verts.size(), 
     &verts[0], 
     GL_STATIC_DRAW 
     ); 
} 

Это теперь работает, если его называют в основном, как показан в моих предыдущих редактированиях, но экран пустого черное окно без объекта рисуется? в попытке передвигаться с моей «камерой», но не видите его в окне просмотра где угодно?

Редактировать 3- Единственное, что я заметил, отличалось от нашего кода, так это то, как мы смотрели на мир. Вы используете glortho(...); в то время как я использую gltranslatef(...); После того, как я изменил его я получил его, чтобы сделать на экране:

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(-5, 5, -5, 5, -5, 5); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
render... 

так, теперь мой вопрос будет, почему он будет оказывать штраф в цикле массива но не в VBO с использованием glTranslatef(...);?

Edit 4 - Окончательное решение кажется им не использует перспективу, чтобы правильно настроить один, после небольшого рытья и играть около IV мест glOrtho(...); с gluPerspective(45, g_iWindowWidth/g_iWindowHeight, 1.0, 500.0); , а затем предварительно мои относительные переводы с в представлении модели, это в В двух словах я дал мне то, что хочу. - видит меня есть много больше читать, чтобы сделать :)

ответ

2
glVertexPointer(3, GL_FLOAT, sizeof(float), 0); 
          ^^^^^^^^^^^^^ 

Ваши данные вершина плотно упакованы таким образом stride должен быть 0.

drawText() может быть изменен вашим состоянием; нет способа узнать.

Что-то вроде этого:

screenshot

#include <GL/glew.h> 
#include <GL/glut.h> 
#include <glm/glm.hpp> 
#include <vector> 

GLuint vbo = 0; 
void init() 
{ 
    std::vector<glm::vec3> verts; 
    verts.push_back(glm::vec3(0, 2, -4)); 
    verts.push_back(glm::vec3(-2, -2, -4)); 
    verts.push_back(glm::vec3(2, -2, -4)); 

    glGenBuffers(1, &vbo); 
    glBindBuffer(GL_ARRAY_BUFFER, vbo); 
    glBufferData 
     ( 
     GL_ARRAY_BUFFER, 
     sizeof(glm::vec3) * verts.size(), 
     &verts[0], 
     GL_STATIC_DRAW 
     ); 
} 

void display() 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(-5, 5, -5, 5, -5, 5); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glEnableClientState(GL_VERTEX_ARRAY); 

    glBindBuffer(GL_ARRAY_BUFFER, vbo); 
    glVertexPointer(3, GL_FLOAT, 0, 0); 

    glDrawArrays(GL_TRIANGLES, 0, 3); 

    glDisableClientState(GL_VERTEX_ARRAY); 

    glutSwapBuffers(); 
} 

int main(int argc, char **argv) 
{ 
    glutInitWindowSize(600, 600); 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE); 
    glutCreateWindow("GLUT"); 
    glewInit(); 

    glutDisplayFunc(display); 
    init(); 
    glutMainLoop(); 
    return 0; 
} 

мне было интересно, если вектор GLM :: Vec3 может быть использован вместо массива или вектора поплавков.

Yup. См. Пример.

И если это может быть, есть ли что-то особенное, что вам нужно сообщить openGL, чтобы он использовал данные внутри glm :: vec3 datatype?

Nope.

+0

Здравствуйте, genpfault! Спасибо за ваш ответ. Ваш код действительно отлично меняет мой main.cpp с вашим. однако, когда я включаю свой код в свой собственный, я возвращаюсь с тем же самым белым экраном, если его всплывают на дисплее func, и такая же ошибка прерывания, если он выскочил в главную или init func. здесь линию, она разбивает на 'glGenBuffers (1, &vbo);' ' Необработанное исключение при 0x753DC9F5 в OpenGL Template.exe: 0xC0000005: Нарушение прав доступа выполнение месте, 0x00000000.' я полностью раздели мой код до нуля , и прокомментировал строку за строкой, чтобы увидеть, могу ли я - следующий пост – Makka

+0

решить проблему, но все это приводит к тому же белым экранам/перерыву. , так что кажется, что-то еще в фауле. Я отредактирую свой первый пост и добавьте в main.cpp, который я использую, если у вас есть момент, вы можете дать ему пробег и посмотреть, что вы получаете? С наилучшими пожеланиями, Мэтт - еще раз спасибо! – Makka

+0

ps чем kyou для устранения вопроса gln :: vec3, в основном использующего размер glm :: vec3 и умножая его на размер данных векторных данных. sizeof (glm :: vec3) * verts.size() – Makka