C++ 如何在OpenGL中仅为一个对象设置材质?

C++ 如何在OpenGL中仅为一个对象设置材质?,c++,opengl,opengl-compat,C++,Opengl,Opengl Compat,我有两个3D对象,我只需要使用glMaterial功能在其中一个对象上设置材质。我怎样才能做到这一点 #include <GLUT/glut.h> #include <cmath> const int width = 1200, height = 600; float xValue = 0.0; float position = 0.0; float angle = 0.0; float shininess[] = { 1.0 }; float color[]

我有两个3D对象,我只需要使用
glMaterial
功能在其中一个对象上设置材质。我怎样才能做到这一点

#include <GLUT/glut.h>
#include <cmath>


const int width = 1200, height = 600;


float xValue = 0.0;
float position = 0.0;
float angle = 0.0;

float shininess[] = { 1.0 };
float color[] = { 0.2, 0.2, 0.8 };


void init(void);
void display(void);


int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(width, height);
    glutInitWindowPosition(85, 75);
    glutCreateWindow("3D объекты - освещение");

    init();
    glutDisplayFunc(display);
    glutMainLoop();

    return 0;
}

void init(void) {
    glClearColor(0.0, 0.0, 0.0, 1.0);

    glEnable(GL_LIGHTING);

    float lightAmbient[] = { 0.5, 0.5, 0.5, 0.0 };
    float lightDiffuse[] = { 0.5, 0.5, 0.5, 0.0 };
    float lightSpecular[] = { 0.5, 0.5, 0.5, 0.0 };
    float lightPosition[] = { -10.0, 5.0, 0.0, 1.0 };

    glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, lightSpecular);
    glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);

    glEnable(GL_LIGHT0);

    glEnable(GL_DEPTH_TEST);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glOrtho(-10.0, 10.0, -5.0, 5.0, -5.0, 5.0);
}

void display(void) {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glViewport(0.0, 0.0, width, height);

    xValue += 0.01;
    position = 5.0*cos(xValue);
    angle = 270.0*sin(xValue);

    glLineWidth(3);

    glPushMatrix();
        glTranslatef(position, 0.0, 0.0);
        glRotatef(angle, 0, 1, 0);

        glMaterialfv(GL_FRONT, GL_AMBIENT, color);
        glMaterialfv(GL_FRONT, GL_DIFFUSE, color);
        glMaterialfv(GL_FRONT, GL_SPECULAR, color);
        glMaterialfv(GL_FRONT, GL_SHININESS, shininess);

        glutWireTorus(1, 2, 35, 35);
    glPopMatrix();

    glPushMatrix();
        glTranslatef(-position, 0.0, 0.0);
        glRotatef(angle, 0, 1, 0);

        glutSolidTorus(0.5, 3.5, 35, 35);
    glPopMatrix();

    glutSwapBuffers();
    glutPostRedisplay();
}
#包括
#包括
常数int宽度=1200,高度=600;
浮动xValue=0.0;
浮动位置=0.0;
浮动角度=0.0;
浮动光泽度[]={1.0};
浮动颜色[]={0.2,0.2,0.8};
void init(void);
作废显示(作废);
int main(int argc,字符**argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_双精度| GLUT_RGB | GLUT_深度);
glutInitWindowSize(宽度、高度);
位置(85,75);
玻璃窗(“三维玻璃窗”);
init();
glutDisplayFunc(显示器);
glutMainLoop();
返回0;
}
void init(void){
glClearColor(0.0,0.0,0.0,1.0);
glEnable(德国劳埃德大学照明);
float lightAmbient[]={0.5,0.5,0.5,0.0};
float lightDiffuse[]={0.5,0.5,0.5,0.0};
float lightSpecular[]={0.5,0.5,0.5,0.0};
浮动光位置[]={-10.0,5.0,0.0,1.0};
glLightfv(GL_LIGHT0、GL_AMBIENT、lightAmbient);
glLightfv(GL_LIGHT0,GL_DIFFUSE,lightDiffuse);
glLightfv(GL_LIGHT0,GL_镜面反射,lightSpecular);
glLightfv(GL_LIGHT0,GL_位置,lightPosition);
glEnable(GL_LIGHT0);
glEnable(GLU深度试验);
glMatrixMode(GLU模型视图);
glLoadIdentity();
格洛托(-10.0,10.0,-5.0,5.0,-5.0,5.0);
}
作废显示(作废){
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glViewport(0.0、0.0、宽度、高度);
xValue+=0.01;
位置=5.0*cos(xValue);
角度=270.0*sin(x值);
线宽(3);
glPushMatrix();
glTranslatef(位置,0.0,0.0);
glRotatef(角度,0,1,0);
GLMATERIALV(GL_前部、GL_环境光、颜色);
GLMATERIALV(GL_前部、GL_漫反射、颜色);
GLMATERIALV(GL_前部、GL_镜面反射、颜色);
GLMATERIALV(GLU正面、GLU反光、反光);
glutWireTorus(1,2,35,35);
glPopMatrix();
glPushMatrix();
glTranslatef(-position,0.0,0.0);
glRotatef(角度,0,1,0);
固形环(0.5,3.5,35,35);
glPopMatrix();
glutSwapBuffers();
再发现();
}

OpenGL是一个状态引擎。每个状态都会一直保持,直到再次更改为止,甚至在帧之外。例如,可以在绘制对象之前启用和禁用照明:

glEnable(GL_照明);
//黑暗物体1
glDisable(GLU照明);
//绘制对象2
同样,在绘制对象之前,可以分别为每个对象设置材质设置:

glmaterialsv(…);
//黑暗物体1
GLMATERIALV(…);
//绘制对象2