c++ - 将 OpenGL VBO 与自定义类/数据结构一起使用

标签 c++ opengl glut vbo

我正在尝试优化四边形的绘制(目前使用 glBeginglEnd ),我读到 VBO 是执行此操作的更好方法。我的问题是我没有 GLuint 的基本数组使用索引数组,而是自定义类来保存值:

Location.hpp : 保存 x、y 和 z 信息

class Location {
public:
    Location(int x_, int y_, int z_);
    ~Location();

    int x;
    int y;
    int z;
}; 

Face.hpp : 持有 4 Location*标记角的 s

class Face {
public:
    Face(Location* bl_, Location* br_, Location* tr_, Location* tl_); // Using point
    Face(int bl_[3], int br_[3], int tr_[3], int tl_[3]); // Using {x, y, z} int array
    ~Face();
    Location* bl = NULL; // Bottom Left
    Location* br = NULL; // Bottom Right
    Location* tr = NULL; // Top Right
    Location* tl = NULL; // Top Left
};

我的问题是,我有一个人脸 vector ( std::vector<Face*> facesToRender; ),我想在屏幕上显示它。

现在我有一个循环来执行此操作:

信息:

Chunk类创建一个 facesToRender我相信这是我可以放 vboId 的地方)

chunksChunk* 的数组

glPushMatrix();
    for (int i = 0; i < chunks.size(); i++) {
        Chunk* chunk = chunks[i];
        for (int j = 0; j < chunk->facesToRender.size(); j++) {
            Face* f = chunk->facesToRender[j];
            srand(i); // Create a color per chunk
            glColor3ub(rand()%255, rand()%255, rand()%255);
            glBegin(GL_QUADS);
            glVertex3i(f->bl->x, f->bl->y, f->bl->z);
            glVertex3i(f->br->x, f->br->y, f->br->z);
            glVertex3i(f->tr->x, f->tr->y, f->tr->z);
            glVertex3i(f->tl->x, f->tl->y, f->tl->z);
            glEnd();
        }
    }
glPopMatrix();

我的问题是如何处理这个 facesToRender vector 到一个 VBO 让它显示。我是 OpenGL 和 C++ 的初学者(虽然我知道其他语言,如果我在类(class)中犯了一些大错误,我深表歉意)。

如果需要任何其他信息,请发表评论!

最佳答案

首先你要保证顶点坐标在内存中是连续且连续的区域,不会被分割成很多小块。使用 Location bl, br, tr, tl而不是 Location *bl ...std::vector<Face>而不是 std::vector<Face*> .然后你有一个连续的顶点坐标列表,可以绑定(bind)到顶点缓冲区对象:

class Face {
public:
    Location bl;
    Location br;
    Location tr;
    Location tl;
};

std::vector<Location> faces;

创建顶点数组对象并绑定(bind)数据

GLuint vbo;
glGenBuffers( 1, &vbo );
glBindBuffer( GL_ARRAY_BUFFER, vbo );
glBufferData( GL_ARRAY_BUFFER, faces.size()*sizeof(*faces.data()), faces.data(), GL_STATIC_DRAW );
glBindBuffer( GL_ARRAY_BUFFER, 0 );

绘制网格:

glBindBuffer( GL_ARRAY_BUFFER, vbo );
glVertexPointer( 3, GL_INT, sizeof(Location), nullptr );
glEnableClientState( GL_VERTEX_ARRAY );    

glPushMatrix();
for (int i = 0; i < chunks.size(); i++) {
    Chunk* chunk = chunks[i];
    for (int j = 0; j < chunk->facesToRender.size(); j++) {
        Face* f = chunk->facesToRender[j];
        srand(i); // Create a color per chunk

        glColor3ub(rand()%255, rand()%255, rand()%255);            
        glDrawArrays(GL_QUADS, j*4, 4);
    }
}
glPopMatrix();

glDisableClientState( GL_VERTEX_ARRAY );



作为替代方案,您可以创建一个顶点坐标列表和一个面列表,每个面都包含角坐标的 4 个索引。

std::vector<Location> vertices;

struct Face
{
    int bl;
    int br;
    int tr;
    int tl;
};

std::vector<Face> faces;

索引顶点cordiaten可以通过 glDrawElements 绘制.

关于c++ - 将 OpenGL VBO 与自定义类/数据结构一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49912575/

相关文章:

opengl - GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 试图创建多采样帧缓冲区

c - 在 CentOS 6.6 上测试 openGL/libGL 库

objective-c - Cocoa 和 OpenGL 茶壶未正确绘制

c++ - 修改和非修改 putback() 之间的区别

python - 重复平铺背景pygame

c++ - 在 Windows 中,UuidFromString 和 CLSIDFromString 之间有区别吗?

c++ - 使用 openGL 着色器倾斜图像

c++ - 从 Freeglut/Opengl 2.1 项目获取返回值

c++ - 专门化类模板中定义的类型?

c++ - 在 C++0x 中专门针对 lambda 模板