所以我有这个课程:
class BRENDERDLL_API Vertex
{
private:
glm::vec3 pos;
public:
Vertex(glm::vec3 pos);
~Vertex();
void setPos(glm::vec3 pos);
glm::vec3 getPos();
};
我想改变:
glm::vec3 pos;
为:
glm::vec3* pos;
然后我需要改变:
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
以某种方式指出我存储数据的位置。第一个案例显然没有问题,但第二个版本怎么办? 我可以做到这一点,还是应该将数据复制到某个阵列?
答案 0 :(得分:1)
将此更改为glm::vec3*
根本不会让您受益,特别是在现代GL中。您需要做的是创建Vertex
的实例数组。
你必须将这些东西存储在顶点缓冲区中,这意味着它需要在内存中“平坦地”布局(例如没有指针解除引用)。如果您有一个连续的Vertex
数组,那么您可以获取第一个实例的地址并使用glBufferData (...)
将其上传到GL管理的内存。
std::vector <Vertex> verts;
const size_t size = verts.size () * sizeof (Vertex);
// Generate, allocate and upload your array to an OpenGL Buffer Object
GLuint vbo;
glGenBuffers (1, &vbo);
glBindBuffer (GL_ARRAY_BUFFER, vbo);
glBufferData (GL_ARRAY_BUFFER, size, &verts [0], GL_STATIC_DRAW);
// This points to address **0** relative to the buffer currently bound to
// GL_ARRAY_BUFFER.
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);