c++ - 如何在 OpenGL 中高效地显示数千个具有动态颜色的相同网格?

标签 c++ opengl 3d

我有一个简单的网格。一个立方体。它的透明度为 50%。

我需要显示数千个,但每一个的颜色和透明度在每一帧都会改变。整个立方体都会改变颜色,而不仅仅是一组面。网格保持不变,立方体位置的变化非常小(但有一些)。

到目前为止,我所看到的是“实例化”,但我只在静态项目中看到过。

如何在 OpenGL 中显示数千个变色立方体?

最佳答案

实例化是一种潜在的解决方案。

您所做的不是仅将位置设为实例变量,而是将颜色设为实例变量。

一个 VBO 拥有完整的立方体网格。

另一个有一个序列InstanceData {vec3 position, vec3 color}

您将属性指定为:

glBindBuffer(GL_ARRAY_BUFFER, instanceBuffer);
glVertexAttribPointer(cubePosLoc, 3, GL_FLOAT, GL_FALSE, sizeof(InstanceData), (void*)offsetof(position, InstanceData));

glVertexAttribPointer(cubeColorLoc, 3, GL_FLOAT, GL_FALSE, sizeof(InstanceData), (void*)offsetof(color, InstanceData));

并为 cubePosLoccubeColorLoc 设置 AttributeDivisor

然后在顶点着色器中将这些视为普通属性。 (将 Cubeposition 添加到顶点的位置并将颜色传递给片段着色器)

在每一帧之间,您使用新的位置和颜色更新 instanceBuffer

关于c++ - 如何在 OpenGL 中高效地显示数千个具有动态颜色的相同网格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31946727/

相关文章:

c++ - 在 OpenGL 中移动相机

wpf - 在WPF中绘制3D线

c++ - __FILE__ 、 __LINE__ 和 __PRETTY_FUNCTION__ 的 Visual C++ 等效项

c++ - 试图在列表上 push_back。 C++

c++ - 手动生成 mipmap

opengl - DX9 和 DX10) : what is the default pixel (and vertex) shader?(如果可能,还有 OpenGL。)

javascript - 在 WebGL 中绘制 3D 形状的第一步

math - 如何在大致等距的 D 维球面上绘制 N 个点?

c++ - 如何让QTcpsocket在关闭DialogWindow后保持连接?

c++ - 非成员函数 'int find(const T&)' 不能有 cv-qualifier