我正在开发一个用于大学项目的Frogger游戏版本,我们得到了光和材料部分。我遇到的问题是:当我为青蛙设置材料时,它会将它们应用于绘制的所有其他对象。 我如何制作它只适用于青蛙? 如果我在绘制后或在设置材料属性后禁用GL_COLOR_MATERIAL,则一切都会变为红色。
void Frog::draw(void)
{
Vector3 _pos = Entity::getPosition();
glPushMatrix();
glEnable(GL_COLOR_MATERIAL);
GLfloat greenEmissiveMaterial[] = {1.0, 0.0, 0.0};
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
GLfloat mat_ambient[] = {0.7, 0.0, 0.0, 1.0};
GLfloat mat_diffuse[] = { 0.7, 0.0, 0.0, 1.0 };
GLfloat mat_specular[] = { 0.0, 0.0, 0.0, 0.0 };
GLfloat mat_shininess[] = {1.8 };
glColor3f(1.0, 0.0, 0.0);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glDisable(GL_COLOR_MATERIAL);
glScalef(0.1, 0.1, 0.1);
glTranslatef( _pos.getX()*U , _pos.getY()*U , 1 );
//CORPO
glPushMatrix();
glColor3f(0.0, 1.0, 0.0);
glutSolidSphere(0.5,50,50);
glPopMatrix();
glPushMatrix();
glColor3f(0.0, 1.0, 0.0);
glTranslatef(0.0, 0.5, 0.0);
glutSolidSphere(0.3,50,50);
glPopMatrix();
glPopMatrix();
}
答案 0 :(得分:5)
启用状态GL_COLOR_MATERIAL
会使材质颜色跟踪您在调用glColorMaterial (...)
时指定的面部的当前颜色。换句话说,虽然已启用GL_COLOR_MATERIAL
并且已设置glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE)
,但GL_AMBIENT
和GL_DIFFUSE
的值仅由当前颜色确定 对于前面。
glColor3f (1.0f, 0.0f, 0.0f);
glColor3f (1.0f, 0.0f, 0.0f); // Set the "current" color
GLfloat red [3] = { 1.0f, 0.0f, 0.0f };
glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red);
您可以看到您已将GL_AMBIENT
和GL_DIFFUSE
的值更改为红色。并且您还尝试在原始代码中启用该状态时手动更改环境/漫反射材质颜色,这不会做任何事情。
名称
glColorMaterial - 使材质颜色跟踪当前颜色
C规范
void glColorMaterial(GLenum face, GLenum模式);
描述
glColorMaterial
指定哪些材质参数跟踪当前颜色。启用GL_COLOR_MATERIAL
时,由mode指定的材质参数或参数指定的材料参数 始终跟踪当前颜色 。< / p>要启用和停用
GL_COLOR_MATERIAL
,请使用参数glEnable
调用glDisable
和GL_COLOR_MATERIAL
。GL_COLOR_MATERIAL
最初已停用。
如果您想停止跟踪当前颜色并使用mat_ambient
和mat_diffuse
中的值,那么您应该在 之后添加以下代码 您停用了GL_COLOR_MATERIAL
:
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);