2012-01-28 23 views
5

Używam SFML do utworzenia okna.Nie można przetestować głębokości w OpenGL

Na tym rysunku sześcian powinien znajdować się za piramidą, ale po prostu nie działa. Screenshot

Oto minimalny kod użyłem:

#include <OpenGL/gl.h> 
#include <OpenGL/glu.h> 

#include <SFML/Graphics.hpp> 
#include "ResourcePath.hpp" 

void resize(); 
void drawScene(); 
void initGL(); 

float rtri = 0; 
float rquad = 0; 
float z = -10.0f; 
int main (int argc, const char * argv[]) 
{ 
    // Create the main window 
    sf::RenderWindow *window = new sf::RenderWindow(); 
    window->Create(sf::VideoMode(800, 600, 32), "Collision Detection", sf::Style::Close); 

    sf::Event event; 

    bool run = true; 
    initGL(); 
    resize(); 
    while(run) { 
     window->PollEvent(event); 
     if(event.Type == sf::Event::Closed) { 
      run = false; 
     } 

     drawScene(); 
     window->Display(); 
//  z+= 0.001f; 
    } 

    return EXIT_SUCCESS; 
} 

void resize() { 
    glViewport(0,0, 800,600); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

    // Calculate The Aspect Ratio Of The Window 
    gluPerspective(45.0f,800/600,0.1f,100.0f); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
} 

void drawScene() { 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer 
    glLoadIdentity();     // Reset The Current Modelview Matrix 
    glTranslatef(0.0f,0.0f,-6.0f);  // Move Left 1.5 Units And Into The Screen 6.0 
    glRotatef(rtri,0.0f,1.0f,0.0f);  // Rotate The Triangle On The Y axis (NEW) 
    glBegin(GL_TRIANGLES); 
    glColor3f(1.0f,0.0f,0.0f); 
    glVertex3f(0.0f, 1.0f, 0.0f); 
    glColor3f(0.0f,1.0f,0.0f); 
    glVertex3f(-1.0f,-1.0f, 1.0f); 
    glColor3f(0.0f,0.0f,1.0f);  
    glVertex3f(1.0f,-1.0f, 1.0f); 
    glColor3f(1.0f,0.0f,0.0f);  
    glVertex3f(0.0f, 1.0f, 0.0f); 
    glColor3f(0.0f,0.0f,1.0f);  
    glVertex3f(1.0f,-1.0f, 1.0f); 
    glColor3f(0.0f,1.0f,0.0f);  
    glVertex3f(1.0f,-1.0f, -1.0f); 
    glColor3f(1.0f,0.0f,0.0f);  
    glVertex3f(0.0f, 1.0f, 0.0f); 
    glColor3f(0.0f,1.0f,0.0f);  
    glVertex3f(1.0f,-1.0f, -1.0f); 
    glColor3f(0.0f,0.0f,1.0f);  
    glVertex3f(-1.0f,-1.0f, -1.0f); 
    glColor3f(1.0f,0.0f,0.0f);  
    glVertex3f(0.0f, 1.0f, 0.0f); 
    glColor3f(0.0f,0.0f,1.0f);  
    glVertex3f(-1.0f,-1.0f,-1.0f); 
    glColor3f(0.0f,1.0f,0.0f);  
    glVertex3f(-1.0f,-1.0f, 1.0f); 
    glEnd();       

    glLoadIdentity();    // Reset The Current Modelview Matrix 
    glTranslatef(0.0f,0.0f,z);  // Move Right 1.5 Units And Into The Screen 7.0 
    glRotatef(rquad,1.0f,1.0f,z); // Rotate The Quad On The X axis (NEW) 
    glBegin(GL_QUADS);   
    glColor3f(0.0f,1.0f,0.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); 
    glColor3f(1.0f,0.5f,0.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); 
    glColor3f(1.0f,0.0f,0.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); 
    glColor3f(1.0f,1.0f,0.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); 
    glColor3f(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); 
    glColor3f(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); 
    glEnd();           // Done Drawing The Quad 

    rtri+=0.2f;           // Increase The Rotation Variable For The Triangle (NEW) 
    rquad-=0.15f; 
    z-=0.01; 
} 

void initGL() { 
    glShadeModel(GL_SMOOTH);       // Enable Smooth Shading 
    glClearColor(0.0f, 0.0f, 0.0f, 0.5f);    // Black Background 
    glClearDepth(1.0f);         // Depth Buffer Setup 
    glEnable(GL_DEPTH_TEST);       // Enables Depth Testing 
    glDepthFunc(GL_LEQUAL);        // The Type Of Depth Testing To Do 
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); 
    glEnable(GL_CULL_FACE); 

    /* Position the camera */ 
    glTranslatef(0, 0, -5); 
} 

Próbowałem różne funkcje głębokość, GL_LESS, GL_EQUAL, próbowałem je wszystkie. Również włączanie i wyłączanie testowania głębokości w różnych miejscach, nic nie działa.

Używam systemu Mac OS X 10.7 (Lion), nie jestem pewien, czy jest to ważne, chociaż wydawało się, że nie mam żadnych problemów z tymi rzeczami przed aktualizacją.

Odpowiedz

9

Twój kod wygląda dobrze. Podejrzewam, że twoje okno po prostu nie ma bufora głębi. Używasz sf::RenderWindow, którego documentation mówi (Kopalnia nacisk):

prosty wrapper dla sf::Window który umożliwia łatwy 2D rendering.

nie wiem SFML, ale to tutorial sugeruje, aby utworzyć okno jak poniżej:

sf::WindowSettings Settings; 
Settings.DepthBits   = 24; // Request a 24 bits depth buffer 
Settings.StencilBits  = 8; // Request a 8 bits stencil buffer 
Settings.AntialiasingLevel = 2; // Request 2 levels of antialiasing 
sf::Window App(sf::VideoMode(800, 600, 32), "SFML OpenGL", sf::Style::Close, Settings); 

Można ustawić StencilBits i AntialiasingLevel 0 ponieważ ten przykład nie są potrzebne.

+2

Dziękuję bardzo! Przechodzę przez mój kod przez kilka dni i zapomniałem, że zaktualizowałem SFML do wersji 2.0, co wyłącza bufor głębi (podobno). Dla każdego, kto ma taki problem: WindowSettings nie istnieje już w SFML 2.0, zamiast tego użyj ContextSettings. – RadicalRaid

0

W najnowszej wersji SFML WindowSettings zastąpionej przez ContextSettings. Ustawienia głębokości można skonfigurować jako.

//Configuring SFML window 
sf::ContextSettings window_settings; 
window_settings.depthBits   = 24; // Request a 24-bit depth buffer 
window_settings.stencilBits  = 8; // Request a 8 bits stencil buffer 
window_settings.antialiasingLevel = 2; // Request 2 levels of antialiasing 

// Opening SFML window 
sf::Window window(sf::VideoMode(800, 600), "Title", sf::Style::Resize | sf::Style::Close, window_settings); 
glewExperimental = GL_TRUE; 

// Initializing glew and openGL 
glewInit(); 
glViewport(0, 0, 800, 600); 

// Enabling Depth 
glEnable(GL_DEPTH_TEST);