OpenGL:Renderbuffer,深度缓冲区

时间:2012-03-10 21:38:43

标签: opengl sfml

我已经从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位深度缓冲区。另外,我不确定如何访问默认的帧缓冲区(或者有两个默认的帧缓冲区,因为有双缓冲?)。

2 个答案:

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