glVertexAttribPointer设置为指针

时间:2015-03-12 09:31:38

标签: c++ pointers opengl

所以我有这个课程:

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);

以某种方式指出我存储数据的位置。第一个案例显然没有问题,但第二个版本怎么办? 我可以做到这一点,还是应该将数据复制到某个阵列?

1 个答案:

答案 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);