[英]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.