我正在为大学项目开发一个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();
}
Run Code Online (Sandbox Code Playgroud)
启用状态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);
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
您可以看到已将GL_AMBIENT
和的值更改GL_DIFFUSE
为红色.并且您还尝试在原始代码中启用该状态时手动更改环境/漫反射材质颜色,这不会执行任何操作.
名称
glColorMaterial - 使材质颜色跟踪当前颜色
C规格
void glColorMaterial(GLenum face,GLenum mode);
描述
glColorMaterial
指定哪些材质参数跟踪当前颜色.当GL_COLOR_MATERIAL
被启用时,材料参数或多个参数由模式指定,材料或通过面指定的材料,跟踪在所有时间的当前颜色.要启用和禁用
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);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
293 次 |
最近记录: |