Проблема с полигоном OpenGL в буфере - PullRequest
0 голосов
/ 23 июля 2010

Вот быстрая и грязная программа C ++ на основе GLUT для окон, которая рисует два прямоугольника, синий и зеленый, на плоском красном фоне.Нажатие «a» или «z» заставляет их вращаться по оси X в любом направлении.Моя проблема в том, что, если я включаю GL_DEPTH_TEST, он иногда рисует один прямоугольник, иногда два, а иногда и просто фон, но никогда неправильно, когда более близкий многоугольник затеняет некоторые или все части более старого.Если не установить GL_DEPTH_TEST, полигоны будут отображаться в порядке рисования.

Что не так с кодом ниже?

#include <windows.h>

#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>

#include <cmath>

#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glu32.lib")

int angle = 0;

void oglDraw()
{
    angle += 360;
    angle %= 360;
    float fAngle = angle / (180 / 3.14159);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    gluPerspective(90, 1, 0, 10);
    gluLookAt(0, 0, -1, 0, 0, 1, 0, 1, 0);

    float yFactor = 1;
    float zFactor = 1; 
    float y = yFactor * sin(fAngle);
    float z = 1 + zFactor - cos(fAngle) * zFactor;

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glClearColor(1, 0, 0, 1);

    glPolygonMode(GL_FRONT, GL_FILL);

    glBegin(GL_POLYGON);
    glColor4f(0, 0, 1, 1);
    glVertex3f(-1.0, y-1.0, z);
    glVertex3f(+1.0, y-1.0, z);
    glVertex3f(+1.0, y+1.0, z);
    glVertex3f(-1.0, y+1.0, z);
    glEnd();

    fAngle = (180 - angle) / (180 / 3.14159);
    y = -yFactor * sin(fAngle);
    z = 1 + zFactor - cos(fAngle) * zFactor;

    glBegin(GL_POLYGON);
    glColor4f(0, 1, 0, 1);
    glVertex3f(-1.0, y-1.0, z);
    glVertex3f(+1.0, y-1.0, z);
    glVertex3f(+1.0, y+1.0, z);
    glVertex3f(-1.0, y+1.0, z);
    glEnd();

    glFlush();
    glutSwapBuffers();
}
//////////////////////////////////////////////////////////////////////////

void oglKeyboard(byte ch, int x, int y)
{
    if(ch == 'z')
    {
        angle++;

        glutPostRedisplay();

    }
    else
    if(ch == 'a')
    {
        angle--;

        glutPostRedisplay();
    }
}
//////////////////////////////////////////////////////////////////////////

int main(int argc, char **argv)
{
    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
    glutInitWindowSize(1024, 768);
    glutCreateWindow("OGL test");
    gluOrtho2D(0, 1024, 768, 0);

    glEnable(GL_DEPTH_TEST);
    glutDisplayFunc(oglDraw);
    glutKeyboardFunc(oglKeyboard);

    glutMainLoop();
}

1 Ответ

1 голос
/ 23 июля 2010

Передайте что-то больше нуля для gluPerspective () zNear:

gluPerspective(90, 1, 0.1, 10);
...