Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[OpenGL+SFML] Bufor głębokości

Ostatnio zmodyfikowano 2018-11-25 10:23
Autor Wiadomość
sppmacd
Temat założony przez niniejszego użytkownika
[OpenGL+SFML] Bufor głębokości
» 2018-11-24 20:21:46
Witam,
mam pewien problem, mianowicie w OpenGL bufor głębokości nie działa tak jak powinien:
Nie wiem czy jakieś znaczenie ma to że używam SFML. Kod jest taki:
C/C++
#include <SFML/OpenGL.hpp>
#include <SFML/Graphics.hpp>

sf::Vector3f translate;

void initialize()
{
    glClearColor( 1.0, 1.0, 1.0, 1.0 );
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
    glTranslatef( translate.x, translate.y, translate.z );
    glFlush();
}

void line( float x1, float y1, float z1, float x2, float y2, float z2 )
{
    glVertex3f( x1, y1, z1 );
    glVertex3f( x2, y2, z2 );
}

void cube( float x1, float y1, float z1, float x2, float y2, float z2, float r, float g, float b )
{
    glColor3f( r, g, b );
    glBegin( GL_LINES );
    line( x1, y1, z1, x2, y1, z1 );
    line( x1, y1, z1, x1, y2, z1 );
    line( x1, y1, z1, x1, y1, z2 );
    line( x1, y2, z1, x1, y2, z2 );
    line( x1, y2, z1, x2, y2, z1 );
    line( x2, y1, z1, x2, y2, z1 );
    line( x2, y1, z1, x2, y1, z2 );
    line( x1, y1, z2, x1, y2, z2 );
    line( x1, y1, z2, x2, y1, z2 );
    line( x2, y2, z2, x2, y2, z1 );
    line( x2, y2, z2, x1, y2, z2 );
    line( x2, y2, z2, x2, y1, z2 );
    glEnd();
}

void faceX( float x, float y1, float z1, float y2, float z2 )
{
    glVertex3f( x, y1, z1 );
    glVertex3f( x, y1, z2 );
    glVertex3f( x, y2, z2 );
    glVertex3f( x, y2, z1 );
}
void faceY( float y, float x1, float z1, float x2, float z2 )
{
    glVertex3f( x1, y, z1 );
    glVertex3f( x1, y, z2 );
    glVertex3f( x2, y, z2 );
    glVertex3f( x2, y, z1 );
}
void faceZ( float z, float x1, float y1, float x2, float y2 )
{
    glVertex3f( x1, y1, z );
    glVertex3f( x2, y1, z );
    glVertex3f( x2, y2, z );
    glVertex3f( x1, y2, z );
}

void filledCube( float x1, float y1, float z1, float x2, float y2, float z2, float r, float g, float b )
{
    glColor3f( r, g, b );
    glBegin( GL_QUADS );
   
    faceX( x1, y1, z1, y2, z2 );
    faceX( x2, y1, z1, y2, z2 );
   
    faceY( y1, x1, z1, x2, z2 );
    faceY( y2, x1, z1, x2, z2 );
   
    faceZ( z1, x1, y1, x2, y2 );
    faceZ( z2, x1, y1, x2, y2 );
   
    glEnd();
}

void render()
{
    initialize();
   
    //glTranslatef(0, 0, - 3.0);
   
    for( int i = - 2; i < 0; i++ )
    for( int j = - 2; j < 0; j++ )
    for( int k = - 2; k < 0; k++ )
    {
        filledCube( i, j, k, i + 1, j + 1, k + 1, i /- 2, j /- 2, k /- 2 );
    }
    glFlush();
}

void init()
{
    glViewport( 0, 0, 500, 500 );
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
   
    glFrustum( - 2.f, 2.f, - 2.f, 2.f, 1.f, 5.f );
   
    glEnable( GL_DEPTH_TEST );
    glDepthFunc( GL_LESS );
    glDepthMask( GL_TRUE );
}

int main()
{
    float scale = 1.f;
    bool b = false;
   
    sf::Window wnd( sf::VideoMode( 500, 500 ), "OpenGL template" );
   
    translate = sf::Vector3f( 0.f, 0.f, - 3.f );
   
    init();
   
    while( wnd.isOpen() )
    {
        sf::Event event;
        while( wnd.pollEvent( event ) )
        {
            if( event.type == sf::Event::Closed )
            {
                wnd.close();
            }
        }
       
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) ) translate += sf::Vector3f( - 0.01f, 0.f, 0.f );
       
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) ) translate += sf::Vector3f( 0.01f, 0.f, 0.f );
       
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::Up ) ) translate += sf::Vector3f( 0.f, 0.01f, 0.f );
       
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::Down ) ) translate += sf::Vector3f( 0.f, - 0.01f, 0.f );
       
        float dScale;
        if( !b )
        {
            dScale = 1.005f;
            scale *= dScale;
            if( scale > 1.33f )
                 b = true;
           
        }
        else
        {
            dScale = 0.995f;
            scale *= dScale;
            if( scale < 0.75f )
                 b = false;
           
        }
        //glScalef(dScale,dScale,dScale);
       
        //glRotatef(0.1f, 0.f, 0.f, 1.f);
       
        render();
        wnd.display();
    }
}
P-172973
pekfos
» 2018-11-24 21:04:18
https://www.sfml-dev.org​/tutorials/2.5/window-opengl.php
C/C++
sf::ContextSettings settings;
settings.depthBits = 24;
settings.stencilBits = 8;
settings.antialiasingLevel = 4;
settings.majorVersion = 3;
settings.minorVersion = 0;

sf::Window wnd( sf::VideoMode( 500, 500 ), "OpenGL template", sf::Style::Default, settings );
P-172974
sppmacd
Temat założony przez niniejszego użytkownika
» 2018-11-25 10:23:59
Jasne, zapomniałem o tym. Teraz wszystko działa. Dziękuję!
P-172979
« 1 »
  Strona 1 z 1