繁体   English   中英

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

[英]OpenGL using std::vector with glm::vec3

我有以下问题。

我已经将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函数从顶点容器的起始地址开始按顺序读取。 顶点容器的元素在我的记忆中被分割。

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

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

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

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

C ++ 11的std::vector有一个内置函数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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM