使用std :: vector和glm :: vec3的OpenGL

时间:2015-01-25 04:45:00

标签: c++ opengl vector glm-math

我遇到以下问题。

我已经将8个glm :: vec3加载到std :: vector中,这样:

std::vector <glm::vec3> vertices;

返回:

0.250000 -0.250000 -0.250000
0.250000 -0.250000 0.250000
-0.250000 -0.250000 0.250000
-0.250000 -0.250000 -0.250000
0.250000 0.250000 -0.250000
0.250000 0.250000 0.250000
-0.250000 0.250000 0.250000
-0.250000 0.250000 -0.250000

如果:

for(int i{0}; i<8; i++){
    std::cout<<"\n";
    for(int j{0}; j<3; j++){
    std::cout<<vertices[i][j]<<" ";
    }
}

当我将以下代码传递给OpenGL时,

glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec3) * vertices.size(), &vertices[0],  GL_DYNAMIC_DRAW);  

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 

glBindVertexArray(buffer);  

我的着色器程序加载并且窗口打开,但是没有立方体。

对第一行略有改动,

glBufferData(GL_ARRAY_BUFFER, sizeof(vert), &vert, GL_DYNAMIC_DRAW); //Here

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

glBindVertexArray(buffer); 

从中获取矢量,

const GLfloat vert[9] =
{-0.5,-0.5, 0.0,
  0.0, 0.5, 0.0,
  0.5,-0.5, 0.0};

并在屏幕上绘制一个漂亮的红色三角形。

我的问题: 是否可以将矢量容器与glm结合使用?如果是这样,它如何实施?
我的假设: glVertexAttribPointer函数从顶点容器的起始地址开始按顺序读取。顶点容器的元素在整个内存中都是碎片化的。

4 个答案:

答案 0 :(得分:1)

glBufferData() &vertices[0]应该是,&vertices[0].x 这是因为&vertices[0]指向glm::vec3,但您希望它指向float
因为那是OpenGL所期望的。

答案 1 :(得分:0)

我不认为您可以将复杂类型传递给着色器。我总是为位置创建一个带浮点数组的结构:

      struct vertex{

         GLfloat positions[3];

      };

然后在你的代码中使用:

      glBufferData(GL_ARRAY_BUFFER, sizeof(vertex) * vertices.size(), &vertices[0],  GL_DYNAMIC_DRAW);  

      glEnableVertexAttribArray(0);
      glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 

      glBindVertexArray(buffer);  

答案 2 :(得分:0)

您是否启用了背面剔除?因为如果您没有设置视图矩阵或者您的相机位于立方体内,那么您可能只看到可能被剔除的背面,而在第二个示例中,三角形面向您的正面,因此可见。 / p>

答案 3 :(得分:0)

C++11's std::vector has a built-in function data(),返回指向基础数据的指针,这样[data()data() + size()]是向量的有效范围。

此外,在处理glm :: ivec类型的数组时,您不需要询问任何数据指针。下面的代码示例是完全有效的OpenGL代码,并且可以毫无问题地呈现:

glm::vec3 vertices[] = {
    glm::vec3(0.0f,  0.0f, 0.0f),
    glm::vec3(0.0f,  1.0f, 0.0f),
    glm::vec3(1.0f,  1.0f, 0.0f)
};
int sizeVertices = sizeof(vertices) / sizeof(glm::vec3);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// ...
glDrawArrays(GL_LINES, 0, sizeVertices);