Biblioteka GLUT oraz wykorzystanie bufora głębokości do usuwania niewidocznych linii

0

Witam, próbuje rozwiązać problem, który polega na usunięciu niewidocznych linii w elipsoidzie.
Wykorzystuje do tego bibliotekę GLUT oraz bufor głębokości (Z-bufor).

Czytałem na ten temat, znalazłem kawałek kodu w internecie, przerobiłem go na własne potrzeby, problem w tym, iż nie usuwa niewidocznych linii.

Czy ktoś zna temat i mógłby mi podsunąć jakąś informację? Gdzie leży błąd lub gdzie mogę się douczyć?

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <GL/gl.h>
#include <GL/glut.h>
#include <GL/glext.h>
#ifndef WIN32
#define GLX_GLXEXT_LEGACY
#include <GL/glx.h>
#define wglGetProcAddress glXGetProcAddressARB
#endif
#include "colors.h"


// stałe do obsługi menu podręcznego

#ifdef near
#undef near
#endif
#ifdef far
#undef far
#endif

// rozmiary bryły obcinania

const GLint left = - 5;
const GLint right = 5;
const GLint bottom = - 5;
const GLint top = 5;
const GLint near = - 5;
const GLint far = 5;

// kąty obrotu sceny

GLfloat rotatex = 0.0;
GLfloat rotatey = 0.0;
GLfloat angle = 0.0;
bool polygon_offset = true;

// wskaźnik naciśnięcia lewego przycisku myszki

int button_state = GLUT_UP;

// położenie kursora myszki

int button_x, button_y;

// funkcja generująca scenę 3D

void DisplayScene()
{
    // kolor tła - zawartość bufora koloru
    glClearColor( 1.0, 1.0, 1.0, 1.0 );

    // czyszczenie bufora koloru i bufora głębokości
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    // wybór macierzy modelowania
    glMatrixMode( GL_MODELVIEW );

    // macierz modelowania = macierz jednostkowa
    glLoadIdentity();

    // obroty całej sceny
    glRotatef( rotatex, 1.0, 0.0, 0.0 );
    glRotatef( rotatey, 0.0, 1.0, 0.0 );

    // włączenie bufora głębokości
    glEnable( GL_DEPTH_TEST );

    //wybor trybu bufora głębokości
    glDepthFunc( GL_ALWAYS);

    // kolor obiektu
    glColor4fv( Green );

         glPushMatrix();
    angle += 0.2;
    glRotatef( angle, 1.0, 1.0, 0.0 );
    glColor3fv( DarkBlue);
    if( polygon_offset )
         glEnable( GL_POLYGON_OFFSET_FILL );

    glPolygonOffset( 1.0, 1.0 );
    glutWireSphere( 3, 20, 20 );
    if( polygon_offset )
         glDisable( GL_POLYGON_OFFSET_FILL );

    glPopMatrix();

    // skierowanie poleceń do wykonania
    glFlush();

    // zamiana buforów koloru
    glutSwapBuffers();
}

// zmiana wielkości okna

void Reshape( int width, int height )
{
    // obszar renderingu - całe okno
    glViewport( 0, 0, width, height );

    // wybór macierzy rzutowania
    glMatrixMode( GL_PROJECTION );

    // macierz rzutowania = macierz jednostkowa
    glLoadIdentity();

    // parametry bryły obcinania
    glOrtho( left, right, bottom, top, near, far );

    // generowanie sceny 3D
    DisplayScene();
}

// obsługa przycisków myszki

void MouseButton( int button, int state, int x, int y )
{
    if( button == GLUT_LEFT_BUTTON )
    {
        // zapamiętanie stanu lewego przycisku myszki
        button_state = state;

        // zapamiętanie położenia kursora myszki
        if( state == GLUT_DOWN )
        {
            button_x = x;
            button_y = y;
        }
    }
}

// obsługa ruchu kursora myszki

void MouseMotion( int x, int y )
{
    if( button_state == GLUT_DOWN )
    {
        rotatey += 50 *( right - left ) /( float ) glutGet( GLUT_WINDOW_WIDTH ) *( x - button_x );
        button_x = x;
        rotatex -= 50 *( top - bottom ) /( float ) glutGet( GLUT_WINDOW_HEIGHT ) *( button_y - y );
        button_y = y;
        glutPostRedisplay();
    }
}

int main( int argc, char * argv[] )
{
    // inicjalizacja biblioteki GLUT
    glutInit( & argc, argv );

    // inicjalizacja bufora ramki
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH );

    // rozmiary głównego okna programu
    glutInitWindowSize( 500, 500 );

    // utworzenie głównego okna programu
    glutCreateWindow( "test" );

    // dołączenie funkcji generującej scenę 3D
    glutDisplayFunc( DisplayScene );

    // dołączenie funkcji wywoływanej przy zmianie rozmiaru okna
    glutReshapeFunc( Reshape );

    // obsługa przycisków myszki
    glutMouseFunc( MouseButton );

    // obsługa ruchu kursora myszki
    glutMotionFunc( MouseMotion );

    // wprowadzenie programu do obsługi pętli komunikatów
    glutMainLoop();
    return 0;
}
0

glOrtho ogranicza rozmiar sceny, powinno pomóc

1 użytkowników online, w tym zalogowanych: 0, gości: 1