OpenGL-点云的不同配色方案

OpenGL- Varying color scheme for point cloud

我有一个函数可以从外部 csv.The 数据读取和绘制点,类似于激光雷达输出的数据。我需要看看是否有办法为一组点赋予不同的颜色。就像 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<float> 数据类型,分别存储 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();

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

但请注意,现代解决方案是将所有点放在 Vertex Buffer Object and to use a Shader program which calculates the color of the fragment. See also 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();