c++ - 如何在OpenGL中仅为一个对象设置 Material ?

标签 c++ opengl opengl-compat

我有两个3D对象,我只需要使用glMaterial函数在其中一个上设置 Material 。我该怎么做?

#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();
}

最佳答案

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

glEnable(GL_LIGHTING);
// darw object 1

glDisable(GL_LIGHTING);
// draw object 2

同样,可以在绘制对象之前分别为每个对象设置 Material 设置:

glMaterialfv(...);
// darw object 1

glMaterialfv(...);
// draw object 2

关于c++ - 如何在OpenGL中仅为一个对象设置 Material ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61096739/

相关文章:

c++ - 为什么OpenGL会切断多边形(即使禁用此设置)?

c++ - 移动时使正方形变大

c++ - 如何让循环重复输入的行数?

python - 如何在 PyOpenGL 中使用顶点数组对象和 glDrawElements 进行绘制

c++ - OpenGL 模型在一段时间内呈现良好,然后在随机时间后呈现稀疏

python - PySide2 QOpenGLWidget按键事件不起作用

python - 如何在 PyOpenGL 中使整个场景的灯光变暗?

c++ - 成员函数内存分配栈还是堆?

c++ - 我不明白 [dcl.fct.default]/3 中的最后一句

c++ - 如何在没有任何其他修改的情况下在 C++ 中对 XML 字符串进行 "pretty print"处理?