C++ 如何高效地绘制单点图

C++ 如何高效地绘制单点图,c++,opengl,opengl-3,C++,Opengl,Opengl 3,我想模拟一个水面。为了在曲面上添加雨滴,我只需要画一个点 我有一个代码(在OpenGL 2.0中): 如何将此代码移植到OpenGL 3.*?当然效率很高 我的想法是只使用简单缓冲区(一个元素)并映射它,然后绘制这个单点: float rainDrop[3] = { pos }; glBindVertexArray(vaoID); glBindBuffer(GL_ARRAY_BUFFER, vboID); glBufferSubData(GL_ARRAY_BUFFER, 0, 3*sizeof

我想模拟一个水面。为了在曲面上添加雨滴,我只需要画一个点

我有一个代码(在OpenGL 2.0中):

如何将此代码移植到OpenGL 3.*?当然效率很高

我的想法是只使用简单缓冲区(一个元素)并映射它,然后绘制这个单点:

float rainDrop[3] = { pos }; 
glBindVertexArray(vaoID);
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glBufferSubData(GL_ARRAY_BUFFER, 0, 3*sizeof(float), rainDrop);
glDrawArrays(GL_POINTS, 0, 1);
glBindVertexArray(0);
但另一种选择可能是使用一个静态缓冲区并更改顶点着色器的统一值


我不想更改我的“算法”,所以让我们只关注绘制这一点。

通常在VBO中指定顶点坐标。在绘制少量基本体时,选择哪个选项应该不会有太大的区别。与其他渲染操作相比,性能差异应该微不足道……

您真的想在整个水面上模拟一个雨滴吗?我在过去做过类似的事情,使用在片段着色器中运行并写入纹理的模拟;我为粒子创建了簇组,并定期将其拉入低分辨率深度/正常G缓冲区,以检测和响应粒子碰撞。在任何情况下,从纹理中采样顶点位置实际上是现代硬件上粒子的一种非常实用的方法(sans compute shader,这当然是在GPU上完全做到这一点的最新和最好的方法)。我想实际更新包含高度数据的纹理中的一个或两个像素。那么简单的glTexSubImage就足够了吗?您是否使用此高度贴图纹理来计算每个帧顶点着色器中的顶点位置?这听起来像是一个相对静态的操作(例如,您实际上只是偶尔动态更改顶点一次),在OpenGL 3中,变换反馈可能是一种更好的方法。*。使用基于纹理的高度贴图时,使用纹理过滤处理LOD确实有好处,但最终在每一帧上执行的计算/内存获取要比您可能需要的多得多。实际上,我使用高度贴图数据计算法线贴图,然后在一个简单的四边形上应用高度贴图。我认为不需要转换反馈。
float rainDrop[3] = { pos }; 
glBindVertexArray(vaoID);
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glBufferSubData(GL_ARRAY_BUFFER, 0, 3*sizeof(float), rainDrop);
glDrawArrays(GL_POINTS, 0, 1);
glBindVertexArray(0);