我正在恢复10年前的一些openGL / glutcode。看起来freeglut已从glut手中接管了,有些情况并不完全相同。这段代码用来给球体上色:
void DrawRider() {
glDisable(GL_TEXTURE_2D);
glMatrixMode(GL_MODELVIEW);
glColor4f(1.0, 0.6, 0.4, 0.5);
glutSolidSphere(0.5, 12, 6);
}
这是设置代码:
void init (void) {
glEnable(GL_DEPTH_TEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //GL_ONE_MINUS_SRC_ALPHA
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glShadeModel(GL_SMOOTH);
glFrontFace(GL_CCW);
glEnable(GL_TEXTURE_2D);
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
if (transparent) glEnable(GL_BLEND);
glColor3f(1.0,1.0,1.0);
gCameraReset();
glPolygonOffset (1.0, 1.0);
SetLighting(4);
glEnable(GL_LIGHTING);
}
这是调用DrawRider的显示代码:
void maindisplay(void)
{
if (textured) glEnable(GL_TEXTURE_2D);
else glDisable(GL_TEXTURE_2D);
if (transparent) glDepthMask(0);
else glDepthMask(1);
if (!riding) {
// track ball rotation
glRotatef (gTrackBallRotation[0], gTrackBallRotation[1], gTrackBallRotation[2], gTrackBallRotation[3]);
glRotatef (gWorldRotation[0], gWorldRotation[1], gWorldRotation[2], gWorldRotation[3]);
}
glClearColor (0.2f, 0.2f, 0.2f, 1.0f); // defines the "background" color
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the surface
if (!riding) DrawRider();
glutSwapBuffers();
}
答案 0 :(得分:0)
启用客户端功能(glEnableClientState
)与glutSolidSphere
冲突。如果启用了客户端状态GL_COLOR_ARRAY
,则尝试从glColorPointer
设置的固定属性数组中读取颜色,而不是使用{{3}设置的当前颜色}。
没有充分的理由启用客户端功能。如果您要绘制自己的几何图形,例如glColor
,则只需要它。
删除使客户端能够解决问题的状态:
void init (void) {
glEnable(GL_DEPTH_TEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
//glEnableClientState(GL_COLOR_ARRAY); <---- delete
//glEnableClientState(GL_VERTEX_ARRAY);
// ...
}
请注意,如果启用了客户端功能并调用了glutSolidSphere
,则不清楚发生什么情况。可能这取决于glut库(glDrawArrays
,freeglut
)及其版本。