2012-03-10 4 views
1

Я переключился с freeglut на SFML для создания контекста/окна OpenGL 3.3. Теперь, когда я использую freeglut и инициализировать режим отображения сOpenGL: Renderbuffer, буфер глубины

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

Когда вы создаете свое окно, вы указываете параметры контекста, которые позволяют вам определять форматы буфера глубины/трафарета. Что-то вроде этого:

sf::Window window(sf::VideoMode(1024, 768, 32), "SFML Window", sf::Style::Default, sf::ContextSettings(24, 8, 0, 3, 3)); 

Вышеуказанный будет содержать 24-битный буфер глубины с 8 битами трафарета. Я предполагаю, что вы используете SFML 2.0 здесь. Не уверен, что он все еще находится в стадии бета-тестирования или, конечно же, является финальной версией.

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