OpenGL простая проблема VBO

Я не в состоянии рисовать, используя VBO.

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

Iv попытался добавить инициализацию vbo в функцию glutinit, но это вызывает перерыв. Iv также попытался вызвать инициализацию VBO в отдельной функции только один раз, чтобы посмотреть, не вызывает ли проблема многократное создание 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 math lib). Мне было интересно, можно ли использовать вектор glm :: vec3 вместо массива или вектора с плавающей точкой. И если это возможно, нужно ли что-то особенное сказать openGL, чтобы он использовал данные в типе данных glm :: vec3? я только спрашиваю, так как его данные с в структуре и доступ к ним, как это в цикле for (*i).x … и т. д. не доступны как стандартный массив или вектор с плавающей точкой, например: (*i)

Редактировать-

Вот урезанный основной вопрос:

#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
);
}

Редактировать 2-
Занимался этим весь день, оглядываясь и теребя. кажется, много комментариев говорят, чтобы вызвать 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(...); ?

Редактировать 4 — Окончательное решение
Кажется, я не использую перспективу, чтобы правильно ее настроить, после того, как немного покопался и поиграл с подкачкой glOrtho(...); с gluPerspective(45, g_iWindowWidth / g_iWindowHeight, 1.0, 500.0);
а затем предварительно сформировал мои относительные переводы в представлении модели, это в двух словах дало мне то, что я хочу. — Видит, у меня много чтения, чтобы сделать 🙂

2

Решение

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

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

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

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

Скриншот

#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 вместо массива или вектора с плавающей точкой.

Ага. Смотрите пример.

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

Нету.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]