0

So I have drawn 5 tori on my scene and a cube behind them and besides LIGHT0 I also have LIGHT1 enabled on click. I need to create two different materials where when I press on number 1 material 1 turns on, and when I press 2 material two turns on instead of material one. But what happens is, those materials get turned on only for tori, not the cube behind them. Here is everything in the code explained:

void light_1() {
    GLfloat light_position[] = {1.0f, 1.0f, 1.0f, 0.0f};
    GLfloat light_specular[] = {1.0f, 1.0f, 1.0f, 5.0f};

    glLightfv(GL_LIGHT1, GL_POSITION, light_position);
    glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular);
    }

Cube and tori have same exact properties.

void drawCube() {
    GLfloat mat_diffuse[] = {0.3, 0.0, 0.7, 1.0}; 
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse);
    glutSolidCube(7.5);
    }

void greenTorus() {
    GLfloat mat_diffuse[] = {0.0, 1.0, 0.0, 1.0};
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse);
    glutSolidTorus(0.08, 0.8, 30, 30);
    }

Here is my display function. Ignore the variables, they are controled by different stuff and are irrelevant.

void display(void) {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity(); 
    gluPerspective(75.0, 4.0/3.0, 1.0, 200.0);

    light_1();

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0.0+LR, 0.0+UD, 2.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

    glPushMatrix();
    glTranslatef(0.0+tyg/2, 0.0-tbr/2, -5.0);
    glRotated(a, 0, 0, 1);
    glScaled(0.5+s, 0.5+s, 0.5+s);
    greenTorus();
    glPopMatrix();

    glPushMatrix();
    glTranslatef(0.0, -0.5, -9.0);
    drawCube();
    glPopMatrix();

    glFlush();
    glutPostRedisplay();
    }

Here is the material that is used for bottom image.

void material_1() {
    GLfloat m_ambient[] = {0.33f, 0.23f, 0.03f, 1.0f};
    GLfloat m_diffuse[] = {0.8f, 0.6f, 0.1f, 1.0f};
    GLfloat m_specular[] = {2.0f, 2.0f, 2.0f, 1.0f};
    GLfloat m_shininess = 128.0f;

    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, m_ambient);
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, m_diffuse);
    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, m_specular);
    glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, m_shininess);
    }

Does anyone see the issue? Here is a screenshot of the scene whole program renders when lights 0 and 1 are both turned on and material_1 is turned on. Why isn't the cube also highlighted? Why does LIGHT0 light on all objects, but LIGHT1 only on tori?

enter image description here

Rabbid76
  • 202,892
  • 27
  • 131
  • 174
me995
  • 59
  • 1
  • 6
  • Most likely the issue is caused by the [Gouraud shading](https://en.wikipedia.org/wiki/Gouraud_shading) model of the [Legacy OpenGL](https://www.khronos.org/opengl/wiki/Legacy_OpenGL) light model. There are 2 possibilities to solve the. Either tessellate each side of the cube into mann small quads or get rid of the legacy OpenGL light mode, which is deprecated since decades, and write your own light model with per fragment lighting in a shader program. Note, you'll never get completely satisfied by the legacy lighting. – Rabbid76 Jun 28 '20 at 19:54
  • See [GLSL fixed function fragment program replacement](https://stackoverflow.com/questions/8421778/glsl-fixed-function-fragment-program-replacement/45716107#45716107) – Rabbid76 Jun 28 '20 at 20:00
  • How can you say "Not all objects with same material look the same " when you set a _different_ material for each object? – derhass Jun 29 '20 at 12:59

0 Answers0