簡體   English   中英

OpenGl 中的頂點緩沖區抽象

[英]Vertex Buffer Abstraction in OpenGl

我一直在嘗試編寫一些類來抽象 OpenGl。 到目前為止,我已經編寫了一個 VertexArray 類,它使用了到目前為止工作正常的模板函數。 但是,我遇到了我無法修復的 VertexBuffer 類問題。 C++ 和 OpenGl 對我來說仍然相當陌生,所以解決方案可能非常簡單。

每當我嘗試用 VertexBuffer 類的構造函數替換 Vertex Buffer 創建代碼時,即使構造函數的代碼和直接編寫在 Mesh 類中的代碼(我相信)相同,屏幕上也不會顯示任何內容.

這是代碼:

頂點緩沖區.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

頂點緩沖區.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);
};

如果有人能幫助我,我會很高興。 提前致謝!

您必須將vb存儲在某種智能指針中或向VertexBuffer添加移動語義。

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

[1]中創建臨時VertexBuffer ,然后通過運算符=將成員ID以淺方式復制到vb ,最后在表達式VertexBuffer銷毀臨時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() );
    }
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM