検索

ホームページ  >  に質問  >  本文

c++ - OpenGL 如何绘制一段颜色渐变的直线

比如

glBegin( GL_LINE_STRIP );
    for(int i=0; i<n; ++i){
        /**
            if( i 满足某条件 )
                glColor3f( 设置为某颜色 );
            else if(///)
                glColor3f(///);
            ...
            这么写似乎不可以
        */
        glVertexf( /*vertex i*/ );
    }
glEnd();
ringa_leeringa_lee2805日前928

全員に返信(3)返信します

  • 伊谢尔伦

    伊谢尔伦2017-04-17 13:06:29

    glBegin( GL_LINE_STRIP );
        glColor3f( 设置为起点颜色 );
        glVertex3f( 起点);
        glColor3f(设置为终点颜色);
        glVertex3f( 终点);
    glEnd();
    

    就这么简单。手写软件渲染是什么鬼,插值都手写了还用opengl干嘛。

    记住,opengl的默认颜色渐变方式就是最简单的线性插值。任何顶点颜色不一样的图元内部都会是渐变。

    如果不想用简单的线性插值,可以使用Shader。可以在fragment shader里根据插值得到的颜色计算应该有的颜色。具体如何使用Shader和modern opengl特性,请阅读最新版本的opengl编程指南。

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 13:06:29

    glShadeModel(GL_SMOOTH);
    题主有写这句吗,如果写了,你只需要设定直线两个端点的颜色,OpenGL会默认帮你绘制渐变颜色;

    不过看你的代码,似乎是想画一系列点,根据一些条件来设置每个点的颜色?建议问题描述地再详细点,贴全面点的代码。

    返事
    0
  • 怪我咯

    怪我咯2017-04-17 13:06:29

    先给你写一个通用Bresenham算法

    void BresenHam(int x1, int y1, int x2, int y2)
    {
        int x = x1;
        int y = y1;
        int dx = abs(x2 - x1);
        int dy = abs(y2 - y1);
        int s1 = sign(x2 - x1);
        int s2 = sign(y2 - y1);
        int interchange = 0;
        if (dy > dx)
        {
            int temp = dx;
            dx = dy;
            dy = temp;
            interchange = 1;
        }
        else
        {
            interchange = 0;
        }
        int e = 2 * dy - dx;
        for (int i = 1;i <= dx;i++)
        {
            //画点 (x,y)
            while (e > 0)
            {
                if (interchange == 1)
                    x = x + s1;
                else
                    y = y + s2;
                e = e - 2 * dx;
            }
            if (interchange == 1)
                y = y + s2;
            else
                x = x + s1;
            e = e + 2 * dy;
        }
    }

    一个一个点画吧,我是这样想的,写个函数来变化R G B分量的数值就行了。。

    返事
    0
  • キャンセル返事