我已经从freeglut切换到SFML for OpenGL 3.3上下文/窗口创建。现在,当我使用freeglut并使用
初始化显示模式时unsigned int displayMode = GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH | GLUT_STENCIL;
glutInitDisplayMode (displayMode);
我可以直接输入
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
glDepthFunc(GL_LEQUAL);
glDepthRange(0.0f, 1.0f);
然后将启用深度测试。但是,在SFML中,它有点复杂。我不会进入SFML代码,但基本上SFML会为您创建一个上下文/窗口。您可以指定深度位和模板位的数量,但似乎SFML实际上没有分配深度缓冲区并将其附加到默认的帧缓冲区。
那么我该怎么做呢?我猜你必须做glGenRenderbuffers
,然后glBindRenderbuffer
然后glRenderbufferStorage
然后glFramebufferRenderbuffer
。文档有点令人困惑。 glRenderbufferStorage
采用internalformat
参数,我不确定如何表明我想要一个24位深度缓冲区。另外,我不确定如何访问默认的帧缓冲区(或者有两个默认的帧缓冲区,因为有双缓冲?)。
答案 0 :(得分:2)
创建窗口时,指定允许您定义深度/模板缓冲区格式的上下文设置。像这样:
sf::Window window(sf::VideoMode(1024, 768, 32), "SFML Window", sf::Style::Default, sf::ContextSettings(24, 8, 0, 3, 3));
以上将指定具有8位模板的24位深度缓冲区。我假设你在这里使用SFML 2.0。不确定它是否仍处于测试版或当然是最终版本。
答案 1 :(得分:0)
在ContextSettings
中可以启用SFML深度。
//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);