c++ - OpenGL 如何绘制一段颜色渐变的直线
ringa_lee
ringa_lee 2017-04-17 13:04:29
0
3
922

比如

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

ringa_lee

全部回覆(3)
伊谢尔伦
glBegin( GL_LINE_STRIP );
    glColor3f( 设置为起点颜色 );
    glVertex3f( 起点);
    glColor3f(设置为终点颜色);
    glVertex3f( 终点);
glEnd();

就這麼簡單。手寫軟體渲染是什麼鬼,插值都手寫了還用opengl幹嘛。

記住,opengl的預設顏色漸變方式就是最簡單的線性內插。任何頂點顏色不一樣的圖元內部都會是漸層。

如果不想用簡單的線性內插,可以使用Shader。可以在fragment shader裡根據插值得到的顏色來計算應有的顏色。具體如何使用Shader和modern opengl特性,請閱讀最新版本的opengl程式指南。

伊谢尔伦

glShadeModel(GL_SMOOTH);
題主有寫這句嗎,如果寫了,你只需要設定直線兩個端點的顏色,OpenGL會預設幫你畫漸層顏色;

不過看你的程式碼,似乎是想畫一系列點,根據一些條件來設定每個點的顏色?建議問題描述地再詳細點,貼上全面點的程式碼。

刘奇

先寫一個通用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分量的數值就行了。 。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板