C++ OpenGL-点云的可变颜色方案

C++ OpenGL-点云的可变颜色方案,c++,opengl,visual-c++,freeglut,glu,C++,Opengl,Visual C++,Freeglut,Glu,我有一个从外部csv读取和绘制点的功能。数据类似于激光雷达输出的数据。我需要看看是否有办法给一组点赋予不同的颜色。与xz平面中半径为0-50的所有圆一样,半径为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]

我有一个从外部csv读取和绘制点的功能。数据类似于激光雷达输出的数据。我需要看看是否有办法给一组点赋予不同的颜色。与xz平面中半径为0-50的所有圆一样,半径为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(); 
glBegin(GL_点);
GL3F(0.961,0.961,0.961);

对于(int i=0;i但请注意,现代解决方案是将所有点放在a中,并使用计算碎片颜色的程序。另请参阅


不管怎样,主要的性能影响是由多重计算引起的。
sqrt
是一个非常耗时的函数。
由于您只想比较距离,因此根本不需要计算距离。您可以比较距离的平方,而不是比较距离。例如:

而不是


if(sqrt((vx[i]*vx[i])+(vz[i]*vz[i]))如果你把所有的点(带颜色)放进去,它可能会渲染得快得多进入顶点缓冲区,然后一遍又一遍地渲染顶点缓冲区。对于堆栈溢出的答案来说,这可能太长了。这很有效。谢谢。我将按照您的建议研究VBO和着色器,以获得更快的渲染操作。
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();