【问题标题】:Vertex Buffer Abstraction in OpenGl [duplicate]OpenGL中的顶点缓冲区抽象[重复]
【发布时间】:2021-10-03 02:22:57
【问题描述】:

我一直在尝试编写一些类来抽象 OpenGL。到目前为止,我已经编写了一个使用模板函数的 VertexArray 类,该类到目前为止运行良好。但是,我的 VertexBuffer 类遇到了我无法修复的问题。 C++ 和 OpenGL 对我来说还是相当新的,所以解决方案可能很简单。

每当我尝试用 VertexBuffer 类的构造函数替换 Vertex Buffer 创建代码时,都会出错并且屏幕上没有任何显示,即使构造函数的代码和直接写在 Mesh 类中的代码是(我相信) 一样。

代码如下:

VertexBuffer.h:

#ifndef VERTEX_BUFFER_H
#define VERTEX_BUFFER_H

class VertexBuffer {
private:
public:
    unsigned int ID;
    VertexBuffer(const void* data, unsigned int size);
    VertexBuffer();
    ~VertexBuffer();
    void bind();
    void unbind();
};

#endif

VertexBuffer.cpp:

#include "VertexBuffer.h"

#define GLEW_STATIC
#include <GL/glew.h>
#include <iostream>

VertexBuffer::VertexBuffer(const void* data, unsigned int size) {
    glGenBuffers(1, &ID);
    glBindBuffer(GL_ARRAY_BUFFER, ID);
    glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW);

    std::cout << "ID = " << ID << std::endl;
    std::cout << "data = " << data << std::endl;
    std::cout << "size = " << size << std::endl << std::endl;
}

VertexBuffer::VertexBuffer() {}

VertexBuffer::~VertexBuffer() {
    glDeleteBuffers(1, &ID);
}

void VertexBuffer::bind() {
    glBindBuffer(GL_ARRAY_BUFFER, ID);
}

void VertexBuffer::unbind() {
    glBindBuffer(GL_ARRAY_BUFFER, 0);
}

我一直试图通过类来实现它的 Mesh 构造函数:

Mesh::Mesh(std::vector<Vertex> vertices) {

    model = glm::mat4(1.0f);
    indicesSize = vertices.size();

    // generate vertex array object
    va = VertexArray();
    va.bind();

    //============================================================

    //This code works:
    /*
    glGenBuffers(1, &vb.ID);
    glBindBuffer(GL_ARRAY_BUFFER, vb.ID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) * vertices.size(), &vertices[0], GL_STATIC_DRAW);
    */

    //------------------------------------------------------------

    //This code does not work:
    vb = VertexBuffer(&vertices[0], sizeof(Vertex) * vertices.size());

    //============================================================

    // points
    va.push<float>(3, 9, false);

    // colors
    va.push<float>(3, 9, false);

    // normals
    va.push<float>(3, 9, false);
};

如果有人可以帮助我,我会很高兴。提前致谢!

【问题讨论】:

标签: c++ class opengl constructor vertex-buffer


【解决方案1】:

您必须将vb 存储在某种智能指针中或将移动语义添加到VertexBuffer

vb = VertexBuffer(&vertices[0], sizeof(Vertex) * vertices.size());
     ^^^ [1]

[1] 中创建临时VertexBuffer,然后通过运算符=,将成员ID 以浅方式复制到vb,最后在表达式末尾临时VertexBuffer 被删除并销毁生成ID(通过临时实例的析构函数),它仍然存储在vb中,但不再有效。

具有移动语义的解决方案可能如下:

class VertexBuffer {
    std::unique_ptr<unsigned int> ID;
public:
    VertexBuffer& operator=(VertexBuffer&& other) {
        ID = std::move(other.ID);
        return *this;
    }

    ~VertexBuffer() {
        if (ID)
            glDeleteBuffers(1, ID.get() );
    }
};

【讨论】:

  • 感谢您对 rafix07 的帮助!祝你有美好的一天......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
相关资源
最近更新 更多