【问题标题】:OpenGL- Varying color scheme for point cloudOpenGL-点云的不同配色方案
【发布时间】:2020-04-19 05:04:11
【问题描述】:

我有一个从外部 csv 读取和绘制点的功能。数据类似于激光雷达输出的数据。我需要看看是否有办法为一组点赋予不同的颜色。就像 xz 平面中半径范围为 0 - 50 的所有圆将具有蓝色,50-10 将具有红色等等。

这是我绘制点的代码

glBegin(GL_POINTS);
glColor3f(0.961, 0.961, 0.961);

for (int i = 0; i <vx.size(); i++)
{
    if (sqrt((vx[i] * vx[i]) + (vz[i] * vz[i]))<96.00)
    {

        glVertex3f(vx[i], vy[i], vz[i]);

    }
}
glEnd(); 

其中 vx,vy 和 vz 是 std::vector&lt;float&gt; 数据类型,分别存储 x,y,z 值。我试过给出如下条件

if (sqrt((vx[i] * vx[i]) + (vz[i] * vz[i]))<5.00)
        {
            glColor3f(1.000, 0.549, 0.000);
            glVertex3f(vx[i], vy[i], vz[i]);
        }


        else if (sqrt((vx[i] * vx[i]) + (vz[i] * vz[i]))>= 5.00 && sqrt((vx[i] * vx[i]) + (vz[i] * vz[i])) <= 10.00)
        {
            glColor3f(1.000, 0.843, 0.000);
            glVertex3f(vx[i], vy[i], vz[i]);
        }

        else if (sqrt((vx[i] * vx[i]) + (vz[i] * vz[i]))>= 11.00 && sqrt((vx[i] * vx[i]) + (vz[i] * vz[i]))<= 20.00)
        {
            glColor3f(1.000, 1.000, 0.000);
            glVertex3f(vx[i], vy[i], vz[i]);

        }
        else if (sqrt((vx[i] * vx[i]) + (vz[i] * vz[i]))>= 21.00 && sqrt((vx[i] * vx[i]) + (vz[i] * vz[i]))<=30.00)
        {
            glColor3f(0.678, 1.000, 0.184);
            glVertex3f(vx[i], vy[i], vz[i]);
        }
-----------------//till radius <96
glend();

这为我生成了所需的输出,但渲染有点慢。我已经包含了缩放和平移功能等,这是由于多个条件检查而滞后的。有没有更有效的方法来做到这一点?

【问题讨论】:

  • 如果将所有点(带有颜色)放入顶点缓冲区,然后一遍又一遍地渲染顶点缓冲区,它可能会渲染得更快。对于 Stack Overflow 的回答来说,这可能太长了。

标签: c++ opengl visual-c++ freeglut glu


【解决方案1】:

但请注意,现代解决方案是将所有点放在Vertex Buffer Object 中并使用Shader 程序计算片段的颜色。另见LearnOpenGL - Shades


无论如何,主要的性能影响是由Euclidean distance 的多次计算造成的。 sqrt 是一个非常耗时的函数。
由于您只想比较距离,因此根本不需要计算距离。您可以比较距离的平方,而不是比较距离。例如:

而不是

if (sqrt((vx[i] * vx[i]) + (vz[i] * vz[i]))<96.00)

if ( vx[i]*vx[i] + vz[i]*vz[i] < 96.00*96.00 )

另外,我建议简化代码,只计算一次距离的平方:

```cpp
glBegin(GL_POINTS);
for (int i = 0; i <vx.size(); i++)
{
    float dist_sq = vx[i]*vx[i] + vz[i]*vz[i];

    if (dist_sq < 5.00 * 5.00)
        glColor3f(1.000, 0.549, 0.000);
    else if (dist_sq < 10.00 * 10.00)
        glColor3f(1.000, 0.843, 0.000);
    else if (dist_sq < 20.00 * 20.00)
        glColor3f(1.000, 1.000, 0.000);
    //  [...]

    glVertex3f(vx[i], vy[i], vz[i]);
}
glEnd();

【讨论】:

  • 成功了。谢谢你。我将按照您的建议研究 VBO 和着色器,以实现更快的渲染操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多