[英]How to write custom comparator for std::minmax function for datatype vector<glm::vec3> (opengl datatype)
[英]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.