OpenGL: рендер-буфер, буфер глубины - PullRequest
1 голос
/ 11 марта 2012

Я перешел с freeglut на SFML для создания контекста / окна 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 ]

2 голосов
/ 11 марта 2012

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

 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 голосов
/ 16 июня 2016

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