2012-01-28 15 views
5

में काम करने के लिए गहराई से परीक्षण नहीं मिल सकता है, मैं विंडो बनाने के लिए SFML का उपयोग करता हूं।ओपनजीएल

इस स्क्रीनशॉट में घन पिरामिड के पीछे होना चाहिए लेकिन यह काम नहीं करता है।

#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); 
} 

मैं कोशिश की है अलग गहराई काम करता है, GL_LESS, GL_EQUAL, मैं उन सभी की कोशिश की है: Screenshot

यहाँ कम से कम कोड मैं प्रयोग किया जाता है। विभिन्न स्थानों पर गहराई से परीक्षण को सक्षम और अक्षम करना, कुछ भी काम नहीं करता है।

मै मैक ओएस एक्स 10.7 (शेर) चला रहा हूं, यह सुनिश्चित नहीं है कि यह महत्वपूर्ण है, हालांकि मुझे अपग्रेड करने से पहले इस तरह की चीजों में कोई परेशानी नहीं लग रही थी।

उत्तर

9

आपका कोड ठीक दिखता है। मुझे संदेह है कि आपकी खिड़की में गहराई बफर नहीं है। आप sf::RenderWindow उपयोग कर रहे हैं, जिसका documentation का कहना है (जोर मेरा):

sf::Window के लिए सरल आवरण इतना आसान 2 डी प्रतिपादन अनुमति देता है।

मैं SFML पता नहीं है, लेकिन इस tutorial इस तरह से अपनी खिड़की बनाने के लिए पता चलता है:

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); 

आप 0 करने के लिए StencilBits और AntialiasingLevel सेट कर सकते हैं के बाद से इस उदाहरण के लिए उन्हें जरूरत नहीं है।

+2

आपको बहुत बहुत धन्यवाद! मैं दिनों के लिए अपने कोड पर जा रहा हूं और मैं भूल गया कि मैंने 2.0 में एसएफएमएल अपडेट किया है, जो गहराई बफर (स्पष्ट रूप से) को अक्षम करता है। इस समस्या में चल रहे किसी और के लिए: एसएफएमएल 2.0 में विंडो सेटिंग्स अब मौजूद नहीं है, इसके बजाय ContextSettings का उपयोग करें। – RadicalRaid

0

एसएफएमएल WindowSettings के नवीनतम संस्करण में ContextSettings द्वारा प्रतिस्थापित किया गया। गहराई सेटिंग्स के रूप में कॉन्फ़िगर किया जा सकता है।

//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);