2 zhuce ly zhuce_ly 于 2016.03.01 16:56 提问

OpenGL中,glColor()指定颜色后不起作用 5C

在使用glColor3f()函数的时候发现了一个问题,画出的图元颜色和glColor3f函数的位置有关系,有时候glColor函数不起作用。
下面有两段代码,作用是画一个红色的太阳,再画一个灰色的地球轨道。
请问为什么第二段代码中画出的太阳是灰色的?理论上说和第一段代码效果是一样的,仅仅是调换了下画图的顺序。
实在不理解。希望各位不吝赐教!谢谢!

第一段代码,这里先画一个红色球体,再画一个绕球体的灰色的圆。

glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
gluLookAt(80,80,30, 0.0,0.0,0.0, 0.0,0.0,1.0);
//----------------->第一个glColor函数,指定太阳为红色<-----------------
glColor3f(1.0,0.0,0.0);  
glutWireSphere(10.0,30,30);//画太阳
 //----------------->第二个glColor函数,指定地球轨道为灰色<-----------------
int int_n = 500;
double PI = 3.141592653;
glColor3f(0.5,0.5,0.5);//指定轨道颜色为灰色
glBegin(GL_LINE_LOOP);//画轨道
for(int i=0;i<int_n;i++)
    glVertex3f(50*cos(2*PI/int_n*i),50*sin(2*PI/int_n*i),0.0);
glEnd();
glFlush();

图片说明

但是,如果先画轨道,再画太阳,太阳的颜色就会变成轨道颜色。代码如下:

 glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
gluLookAt(80,80,30, 0.0,0.0,0.0, 0.0,0.0,1.0);
int int_n = 500;
double PI = 3.141592653;
//----------------->第一个glColor函数,指定轨道为灰色<-----------------
glColor3f(0.5,0.5,0.5);//指定颜色为灰色
glBegin(GL_LINE_LOOP);//画轨道
for(int i=0;i<int_n;i++)
    glVertex3f(50*cos(2*PI/int_n*i),50*sin(2*PI/int_n*i),0.0);
glEnd();
//----------------->第二个glColor函数,指定太阳为红色<-----------------
glColor3f(1.0,0.0,0.0); //指定颜色为红色
glutWireSphere(10.0,30,30);//画太阳
glFlush();

效果如下:
图片说明

1个回答

caozhy
caozhy   Ds   Rxr 2016.03.08 12:02
zhuce_ly
zhuce_ly 这里例子我明白,可是我的问题依然没有解答啊。。。还请再指点一下。谢谢
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
openGL 中 glColor3f()函数 颜色设定
在openGL中编程,经常用到glColor3f()函数进行
OpenGL函数_ glColor函数颜色
在OpenGl中设置颜色,一般可以使用glColor3f()。从函数名字就可以看出,它的参数应该有三个,类型是float型的。另外一点是它的参数值的范围是[0.0,1.0]一般的,可以将这三个参数值视为颜色的成分。0.0 -- > 不使用颜色成分;1.0 -- > 使用颜色的最大值
opengl纹理,光照,glColor4f(),混合
glColor4f()与光照是平级的,且两者互斥,水火不容,有我没你.对于纹理图片中的某个像素P(r,g,b,1): (1)如果有光照L(Lr,Lg,Lb,x),则glColor4f(Cr,Cg,cb,Calpha)无用,像素P应该只乘以光照L,则像素P的实际颜色P1=P*L=(r*Lr,g*Lg,b*Lb,1);(注:P1的alpha恒为1,无须乘以光照的alpha值,即光照的alpha值在此
关于opengl中glColor3f的应用
做毕设时发现glColor3f会互相影响,想着说是否可以排除glColor3f的影响? 后来发现其实没必要,其就是opengl是状态机,也就是设置一个状态后它就保持那个状态进行渲染 因此如果要排除glColor3f的影响就要重新设置颜色状态 PS:各种颜色对应的参数(转别人的) glColor3f(0.0, 0.0, 0.0);  --> 黑色  glColor3f(1.0, 0.0
《高效学习OpenGL》 之 颜色表 glColorTable(),glColorTableParameter(),glCopyColorTable()
1.颜色表的种类 可以调用glEnable()单独启用各个颜色表 2.指定颜色表 glColorTable(GLenum target, GLenum InternelFormat, GLsizei width, GLenum format, GLenum type, const GLvoid* data); //target设置为上表的三个参数时,说明此函数用于定义指定
QT5 OpenGL(七, 透明度设置)
概要 效果图 正常立体图 透明度为05的 透明度为01的 图形设置为绿色时 部分代码的更改概要我们在做与UI或者图形,图片有关的项目时,总会遇到透明度的设置。 opengl也有自己的透明度设置。 值得一提得是,普通的平面图形透明度设置是改变单张平面的显示效果, 而立体图形的呢,这就会使多个平面的图形出现。效果图正常立体图透明度为0.5的透明度为0.1的图形设置为绿色时部分代码的更改void Open
关于opengl的纹理和调色板问题
最近碰到了一点问题,关于图片载入和显示方面的。 自己的引擎显示方面是基于opengl来实现的。显示图片也就是画一个矩形,然后贴上纹理。并且采用了批量绘图方法,将顶点数据存入显存里。用到了glsl。不知道的可以百度一下。 那在大量载入图片成为纹理并存入显存就有问题出现。本地文件先不说,载入到显存后的显存占用就成了问题。网上百度了一番了一些解决方法: 1.压缩纹理 很简单,具体怎么做百度一下你
OpenGL中glClear、glColor4f、glClearColor的简单说明
函数原型:     void glClearColor(GLclampf red,GLclampf green,GLclampf blue,GLclampf alpha); void glColor4f(GLclampf red,GLclampf green,GLclampf blue,GLclampf alpha); void glClear(GLbitfield mask);
OpenGL函数-glColor
OpenGL函数思考-glColor 函数原型:      glColor3b,glColor3d,glColor3f,glColor3i,glColor3s,glColor3ub,glColor3ui,glColor3us,glColor4b,glColor4d,glColor4f,glColor4i,glColor4s,glColor4ub,glColor4ui,glColor4u
Qt_OpenGL:3D旋转自定义换色
Qt_OpenGL:3D旋转自定义换色 //.h #ifndef ROTATEWIDGET_H #define ROTATEWIDGET_H #include #include class RotateWidget : public QGLWidget { Q_OBJECT public: RotateWidget(QWidget *parent =