问题描述
比如
glBegin( GL_LINE_STRIP ); for(int i=0; i<n; ++i){/** if( i 满足某条件 )glColor3f( 设置为某颜色 ); else if(///)glColor3f(///); ... 这么写似乎不可以*/glVertexf( /*vertex i*/ ); }glEnd();
问题解答
回答1:glBegin( GL_LINE_STRIP ); glColor3f( 设置为起点颜色 ); glVertex3f( 起点); glColor3f(设置为终点颜色); glVertex3f( 终点);glEnd();
就这么简单。手写软件渲染是什么鬼,插值都手写了还用opengl干嘛。
记住,opengl的默认颜色渐变方式就是最简单的线性插值。任何顶点颜色不一样的图元内部都会是渐变。
如果不想用简单的线性插值,可以使用Shader。可以在fragment shader里根据插值得到的颜色计算应该有的颜色。具体如何使用Shader和modern opengl特性,请阅读最新版本的opengl编程指南。
回答2:glShadeModel(GL_SMOOTH);题主有写这句吗,如果写了,你只需要设定直线两个端点的颜色,OpenGL会默认帮你绘制渐变颜色;
不过看你的代码,似乎是想画一系列点,根据一些条件来设置每个点的颜色?建议问题描述地再详细点,贴全面点的代码。
回答3:先给你写一个通用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; elsey = y + s2; e = e - 2 * dx;}if (interchange == 1) y = y + s2;else x = x + s1;e = e + 2 * dy; }}
一个一个点画吧,我是这样想的,写个函数来变化R G B分量的数值就行了。。