我遇到以下问题。
我已经将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函数从顶点容器的起始地址开始按顺序读取。顶点容器的元素在整个内存中都是碎片化的。
答案 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);