3D-рисунок куба, только одна сторона всегда сверху

Я работал с фигурами рисования OpenGL C++, в частности с кубами. В моем текущем проекте мне удалось правильно нарисовать куб, но только та сторона куба, которая рисуется последней, не становится прозрачной, когда камера находится прямо на ней. Первые две стороны куба становятся полностью прозрачными, если смотреть в лоб. Есть ли способ исправить это? Вот изображение. Как видите, первые две стороны не отображаются. Вот мой код:

Основной.cpp:

#include "Render.h"
#include <stdlib.h>

int screenHeight = 500;
int screenWidth = 500;
int screenFPS = 60;

void MainLoop(int val);

int main(int argc, char* args[])
{
    glutInit(&argc, args);
    glutInitDisplayMode(GLUT_DOUBLE);
    glutInitWindowSize(screenWidth, screenHeight);
    glutInitWindowPosition(350, 80);
    glutCreateWindow("Cube");
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    //glOrtho(0.0f, screenWidth, screenHeight, 0.0f, 0.0f, 1.0f);
    gluPerspective(40, 1, 0.5, 20);
    glutDisplayFunc(Render);
    glViewport(0, 0, screenWidth, screenHeight);
    glutKeyboardFunc(HandleKeys);
    glutIdleFunc(Animation);
    glutTimerFunc(1000 / screenFPS, MainLoop, 0);
    glutMainLoop();
    return 0;
}

void MainLoop(int val)
{
    Render();
    glutTimerFunc( 1000 / screenFPS, MainLoop, val );
}

Рендер.cpp:

#include "Render.h"
#include <iostream>
#include <stdlib.h>
#include <windows.h>

GLfloat xRot, yRot, zRot;

void Render()
{
    std::cout << xRot << " " << yRot << " " << zRot << "\n";
    glMatrixMode(GL_MODELVIEW);
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();
    glTranslatef(0.0,0.0,-10.5);
    glRotatef(yRot, 1.0, 0.0, 0.0);
    glRotatef(yRot, 0.0, 1.0, 0.0);
    glRotatef(zRot, 0.0, 0.0, 1.0);
    glBegin(GL_QUADS);
       glColor4f(0.0f, 1.0f, 0.0f, 1.0f);
        glVertex3f( 1.0f, 1.0f,-1.0f);
        glVertex3f(-1.0f, 1.0f,-1.0f);
        glVertex3f(-1.0f, 1.0f, 1.0f);
        glVertex3f( 1.0f, 1.0f, 1.0f);
       glColor4f(1.0f, 0.5f, 0.0f, 1.0f);
        glVertex3f( 1.0f,-1.0f, 1.0f);
        glVertex3f(-1.0f,-1.0f, 1.0f);
        glVertex3f(-1.0f,-1.0f,-1.0f);
        glVertex3f( 1.0f,-1.0f,-1.0f);
       glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
        glVertex3f( 1.0f, 1.0f, 1.0f);
        glVertex3f(-1.0f, 1.0f, 1.0f);
        glVertex3f(-1.0f,-1.0f, 1.0f);
        glVertex3f( 1.0f,-1.0f, 1.0f);
       glColor4f(1.0f, 1.0f, 0.0f, 1.0f);
        glVertex3f( 1.0f,-1.0f,-1.0f);
        glVertex3f(-1.0f,-1.0f,-1.0f);
        glVertex3f(-1.0f, 1.0f,-1.0f);
        glVertex3f( 1.0f, 1.0f,-1.0f);
       glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
        glVertex3f(-1.0f, 1.0f, 1.0f);
        glVertex3f(-1.0f, 1.0f,-1.0f);
        glVertex3f(-1.0f,-1.0f,-1.0f);
        glVertex3f(-1.0f,-1.0f, 1.0f);
       glColor4f(1.0f, 0.0f, 1.0f, 1.0f);
        glVertex3f( 1.0f, 1.0f,-1.0f);
        glVertex3f( 1.0f, 1.0f, 1.0f);
        glVertex3f( 1.0f,-1.0f, 1.0f);
        glVertex3f( 1.0f,-1.0f,-1.0f);
    glEnd();
    glutSwapBuffers();
}
void Animation()
{
    yRot += 0.03;
    xRot += 0.08;
    Render();
}
void HandleKeys(unsigned char key, int x, int y)
{
    if(key == 27)
        exit(0);
    else if(key == 'w')
        yRot += 0.55;
    else if(key == 'a')
        xRot -= 0.55;
    else if(key == 's')
        yRot -= 0.55;
    else if(key == 'd')
        xRot += 0.55;
}

Рендер.ч

#include "GLLib.h"
extern int screenHeight;
extern int screenWidth;
extern int screenFPS;
void Render();
void Animation();
void HandleKeys(unsigned char key, int x, int y);

И, наконец, мои библиотеки, GGLib.h:

#ifndef GLLIB_H
#define GLLIB_H
#include <GL/freeglut.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#endif

person Xenonic    schedule 14.02.2015    source источник
comment
Появляются ли четырехугольники под каким-либо другим углом, чтобы в какой-то момент вы могли видеть зеленую или оранжевую сторону?   -  person Ryan Holden    schedule 15.02.2015
comment
Я не знаю, мне не удалось увидеть эти стороны.   -  person Xenonic    schedule 15.02.2015


Ответы (1)


Скорее всего, все стороны нарисованы просто отлично. Проблема в том, что у вас нет буфера глубины. Поэтому все, что нарисовано, заменяет то, что было нарисовано ранее, независимо от того, находится ли оно впереди или позади ранее нарисованной геометрии.

Чтобы использовать буфер глубины, вы должны запросить его во время инициализации:

glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

и включите тестирование глубины перед началом рендеринга:

glEnable(GL_DEPTH_TEST);

Затем при старте рендеринга каждого кадра нужно помимо буфера цвета очищать буфер глубины:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

Это гарантирует, что передние грани будут видны, а грани позади них будут скрыты, независимо от порядка прорисовки.

person Reto Koradi    schedule 14.02.2015