OpenGL:渲染缓冲区,深度缓冲区
问题描述:
我已经从freeglut切换到用于OpenGL 3.3上下文/窗口创建的SFML。现在,当我使用freeglut与OpenGL:渲染缓冲区,深度缓冲区
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位深度缓冲区。另外,我并不确定如何访问默认帧缓冲区(或者是否有两个默认帧缓冲区,因为有双缓冲区?)。
答
当您创建窗口时,您可以指定允许您定义深度/模板缓冲区格式的上下文设置。类似这样的:
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。不知道它是否仍处于测试阶段,或者是最终版本。
答
在SFML深度可以启用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);