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: #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(); 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; } render(); wnd.display(); } }
|