搜尋

首頁  >  問答  >  主體

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_lee2803 天前925

全部回覆(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
  • 取消回覆