我有一个子功能,它读取数据流并基于此创建一个顶点数据数组。主函数重复调用该子函数并更新顶点数据数组,然后将其绑定到缓冲区并绘制。到现在为止还挺好。但是,我不知道如何添加顶点。 C++不会让您重新分配或调整整个数组的大小。我不能使用矢量,因为OpenGL函数需要数组,而不是矢量。OpenGL - 添加顶点
0
A
回答
3
您可以使用矢量来填充OpenGL顶点缓冲区。 vector
中的值保证是连续的。见例如,对于细节这些讨论对相关语言标准:
- Are std::vector elements guaranteed to be contiguous?
- Is it safe to assume that STL vector storage is always contiguous?
这意味着类似下面的代码是安全的:
std::vector<GLfloat> vertexPositions;
// Populate vector with vertex positions.
GLuint bufId = 0;
glGenBuffers(1, &bufId);
glBindBuffer(GL_ARRAY_BUFFER, bufId);
glBufferData(GL_ARRAY_BUFFER, vertexPositions.size() * sizeof(GLfloat),
&vertexPositions[0], GL_STATIC_DRAW);
微妙但关键部分是你传递的地址的第一个元素矢量,而不是矢量对象的地址。
1
我会稍作修改。虽然可以使用顶点位置[0]作为STL向量的开头地址,但我更喜欢使用设计用于返回向量内存开始地址vertexPositions.data()的函数。
std::vector<GLfloat> vertexPositions;
// Populate vector with vertex positions.
GLuint bufId = 0;
glGenBuffers(1, &bufId);
glBindBuffer(GL_ARRAY_BUFFER, bufId);
glBufferData(GL_ARRAY_BUFFER, vertexPositions.size() * sizeof(GLfloat), vertexPositions.data(), GL_STATIC_DRAW);
由于许多原因,我使用STL向量来处理OGL数据。如果知道尺寸,预先分配很容易,添加项目时它们会增长(并保持连续)。它们很容易遍历。如果您想传递交错数据,您可以轻松创建结构向量。这一切都是一样的。
+0
我没有在答案中使用'data()'方法,因为它只在C++ 11中引入,而另一种方法适用于所有版本的C++。无论如何,这看起来更像是评论而非答案。 –
相关问题
- 1. 如何添加顶点到OpenGL C++ triangle_fan
- 2. OpenGL ES - 更新顶点数组,添加/删除顶点
- 3. OpenGL:使用顶点着色器添加顶点
- 4. 加亮OpenGL中的顶点
- 5. 将DirectX顶点转换为OpenGL顶点
- 6. 如何在OpenGl中动态添加顶点?
- 7. iOS上的OpenGL ES向缓冲区添加顶点
- 8. 添加节点顶部
- 9. 添加顶点与Arraylist
- 10. OpenGL中的顶点坐标
- 11. OpenGL生成顶点属性
- 12. OpenGL顶点属性重用
- 13. Opengl地形高度/顶点
- 14. C++/OpenGL/SFML顶点着色
- 15. Star OpenGL的顶点阵列
- 16. OpenGL复制顶点阵列
- 17. OpenGL重叠顶点属性
- 18. 连接球体顶点OpenGL
- 19. Opengl顶点数组对象
- 20. OpenGL顶点和缓冲区
- 21. 顶点重叠在OpenGL
- 22. VBO的顶点数组-OpenGL
- 23. opengl顶点不渲染
- 24. OpenGL的:顶点数组
- 25. OpenGL中的顶点限制
- 26. OpenGL的顶点数组
- 27. C++ OpenGL - 顶点颜色
- 28. OpenGL ES 2.0顶点照明
- 29. 在Three.js中添加点到顶点
- 30. 在mxGraph中添加子顶点到父顶点
有趣。来自Java背景,我没有立即识别矢量 - >指针<->数组路径。谢谢。 – user2258552