OpenGL简单的VBO麻烦

时间:2014-02-15 05:03:54

标签: c++ opengl glut vbo glu

我没能用VBO画画。

我成功使用此代码使用顶点数组进行绘制,但是当我尝试将其弹出到vbo并绘制它时,我只是得到一个空白的白色屏幕。

我尝试将vbo的初始化添加到glutinit函数中,但这会导致中断。我也尝试只在一个单独的func中调用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...

所以,我现在的问题是为什么它会在数组循环中渲染得很好但不能在使用glTranslatef(...);的VBO中渲染?

编辑4 - 最终解决方案 似乎我没有使用透视来正确设置一个,经过一些挖掘和玩{iv}与glOrtho(...);交换gluPerspective(45, g_iWindowWidth / g_iWindowHeight, 1.0, 500.0); 然后在模型视图中执行我的相对翻译,简而言之,这给了我想要的东西。 - 看到我有更多的阅读要做:)

1 个答案:

答案 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的向量而不是浮点数组或向量。

烨。见例。

  

如果它可以,有什么特别的东西你需要告诉openGL它使用glm :: vec3数据类型中的数据吗?

不。