OpenGL с GLUT: твердые объекты являются прозрачными

Я пытаюсь нарисовать робота, который имеет кубоподобную голову, используя glutSolidCube()и рисовать глаза, используя glutSolidSphere(),

По какой-то причине, когда я смотрю на робота с другой стороны, я все еще вижу его глаза на внутренней стороне края куба. Т.е. кажется, что края куба прозрачны и я могу видеть сквозь них.

Как я могу предотвратить эту прозрачность?


Внешний вид:

Фронт



Посмотрите со спины и правого края головы:назад

Я прилагаю свой код здесь:

#include <GL/glut.h>
#include <stdio.h>

GLsizei winWidth = 800;
GLsizei winHeight = 800;


// Global Variables
static float eyeX = 0.0;
static float eyeY = 0.5;
static float eyeZ = 4.0;
static float robotBottomX = 0.0;
static float robotBottomZ = 0.0;

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

void displayFloor() {
    int i, j;

    for (i = -20 ; i < 20 ; i++) {
        int startWithBlack = (i % 2 == 0);
        for (j = -20 ; j < 20 ; j++) {
            int black = ((startWithBlack && abs(j) % 2 == 0) || ((!startWithBlack) && abs(j) % 2 == 1));
            glColor3f(0.0, 1.0, 0.0);
            if (black) {
                glColor3f(1.0, 0.0, 0.0);
            }
            glPushMatrix();
            //glTranslatef((double)i + 0.5, 0.0, (double)j + 0.5);
            glTranslatef((double)i / 2.0, 0.0, (double)j / 2.0);
            glScalef(1.0, 0.0, 1.0);
            glutSolidCube(1.0);
            glPopMatrix();
        }
    }
}

void displayRobot() {
    puts("D: display function was called");

    glClear(GL_COLOR_BUFFER_BIT);
    glPushMatrix();
    gluLookAt(eyeX, eyeY, eyeZ, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
    displayFloor();
    glColor3f(0.2, 0.2, 0.2);
    glScalef(1.0, 1.0, 1.0);
    glTranslatef(robotBottomX, 0.0, robotBottomZ);
    glutSolidCube(1.0);
    glPushMatrix();
    glTranslatef(0.0, 0.6, 0.0);
    glScalef(0.2, 0.2, 0.2);
    glColor3f(0.5, 0.5, 0.2);
    glutSolidCube(1.0);
    glPopMatrix();
    glPushMatrix();
    glTranslatef(0.0, 0.95, 0.0);
    glScalef(0.5, 0.5, 0.5);
    glColor3f(0.2, 0.5, 0.2);
    glutSolidCube(1.0);
    glPopMatrix();
    glPushMatrix();
    glTranslatef(0.15, 1.1, 0.25);
    glScalef(0.05, 0.05, 0.0);
    glColor4f(0.7, 0.7, 0.7, 0.5);
    glutSolidSphere(1.0, 50, 50);
    glPopMatrix();
    glPushMatrix();
    glTranslatef(-0.15, 1.1, 0.28);
    glScalef(0.05, 0.05, 0.0);
    glColor4f(0.7, 0.7, 0.7, 0.5);
    glutSolidSphere(1.0, 50, 50);
    glPopMatrix();
    glPopMatrix();

    glFlush();
}


void winReshape(GLint newWidth, GLint newHeight) {
    glViewport(0, 0, newWidth, newHeight);
    glMatrixMode(GL_PROJECTION);
    glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 20.0);
    glMatrixMode(GL_MODELVIEW);
    glClear(GL_COLOR_BUFFER_BIT);

}

void main(int argc, char **argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(winWidth, winHeight);
    glutCreateWindow("Robot");

    init();
    glutDisplayFunc(displayRobot);
    glutReshapeFunc(winReshape);

    glutMainLoop();
}

1 ответ

Решение

Я нашел решение, поэтому я опубликую его здесь для общественности:

  1. в init() функция, нужно добавить:

    glEnable(GL_DEPTH_TEST);

  2. В функции рисования, в glClear() позвони, добавь " | GL_DEPTH_BUFFER_BIT":

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  3. в main() функция, вglutInitDisplayMode() позвони, добавь " | GLUT_DEPTH":

    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);

Другие вопросы по тегам