如何有效地绘制单点

Posted

技术标签:

【中文标题】如何有效地绘制单点【英文标题】:How to draw single point efficiently 【发布时间】:2013-09-15 15:23:07 【问题描述】:

我有一个想要模拟的水面。为了在表面上添加雨滴,我只需要绘制一个点。

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

float rainDrop[3] =  pos ; 
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, rainDrop);
glDrawArrays(GL_POINTS, 0, 1);
glDisableVertexAttribArray(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);

但也许另一种选择是拥有一个静态缓冲区并更改顶点着色器的统一值?

我不想改变我的“算法”,所以让我们专注于绘制这一点。

【问题讨论】:

您真的想在整个水面上模拟单个雨滴吗?我过去做过类似的事情,使用在片段着色器中运行并写入纹理的模拟;我为粒子创建了集群组,并定期绘制到低分辨率深度/正常 G-Buffer 中以检测和响应粒子碰撞。无论如何,从纹理中采样顶点位置实际上是现代硬件上粒子的一种非常实用的方法(无计算着色器,这当然是在 GPU 上完全做到这一点的最新和最好的方法)。 我想实际更新包含高度数据的纹理中的一两个像素。所以也许简单的 glTexSubImage 就足够了? 您是否使用此高度贴图纹理来计算顶点着色器中每一帧的顶点位置?这听起来像是一个相对静态的操作(例如,您实际上只是偶尔动态更改顶点),变换反馈可能是 OpenGL 3.* 中更好的方法。在使用基于纹理的高度图时,使用纹​​理过滤来处理 LOD 确实有好处,但你最终会在每一帧上进行比你可能需要的更多的计算/内存获取。 我实际上是根据高度图数据计算法线贴图,然后在一个简单的四边形上应用高度图。我认为不需要转换反馈。 【参考方案1】:

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

【讨论】:

以上是关于如何有效地绘制单点的主要内容,如果未能解决你的问题,请参考以下文章

CAS搭建单点登录Web端

基于JWT机制的单点登录

云计算介绍

单点登录原理和java实现简单的单点登录

如何在多点触控序列中有效地处理 UITouch

java实现的单点登录