2012-01-28 62 views
5

我使用SFML來創建窗口。無法進行深度測試以在OpenGL中工作

在此截圖中,立方體應位於金字塔後面,但它不起作用。 Screenshot

這裏是最小碼我用:

#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,我已經試過所有。同時啓用和禁用不同地方的深度測試,似乎沒有任何工作。

我正在運行Mac OS X 10.7(Lion),不確定這是否很重要,儘管在升級之前我似乎沒有遇到任何這類問題。

回答

9

您的代碼看起來沒問題。我懷疑你的窗口根本沒有深度緩衝區。您使用sf::RenderWindow,其​​說(重點煤礦):

sf::Window簡單的包裝,可以很容易2D渲染。

我不知道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); 

您可以設置StencilBitsAntialiasingLevel爲0,因爲這個例子中並不需要它們。

+2

非常感謝!我一直在檢查我的代碼幾天,我忘了將SFML更新爲2.0,這會禁用深度緩衝區(顯然)。對於遇到此問題的其他人:在SFML 2.0中,WindowSettings不再存在,而是使用ContextSettings。 – RadicalRaid 2012-01-28 14:36:46

0

在最新版本的SFML 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); 
相關問題