GL_DEPTH_TEST не работает в OpenGL 3.3

Я пишу простую программу рендеринга с использованием OpenGL 3.3.

В моем коде есть следующие строки (которые должны включать проверку глубины и выборку):

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
ExitOnGLError("ERROR: Could not set OpenGL depth testing options");

glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glFrontFace(GL_CCW);
ExitOnGLError("ERROR: Could not set OpenGL culling options");

Однако после рендеринга я вижу следующий результат:

цветок плохой глубины

Как видите, тест глубины, похоже, не работает. Что я делаю неправильно? Где я должен искать проблему?

Некоторая информация, которая может быть полезна:

  • В матрице проекции у меня ближняя плоскость отсечения установлена ​​на 0,2, а дальняя на 3,2 (поэтому ближняя плоскость не равна нулю).
  • Я рендерил меш и текстурировал его, используя простой метод с glDrawArrays и двумя буферами для координат вершин и текстур. Шейдеры, которые используются для правильного отображения этих массивов.
  • Я не рассчитываю и рисую нормали.
  • Код создания контекста: http://pastebin.com/mRMUxPL1

ОБНОВИТЬ:

Наконец-то все заработало! Оказывается, я не создавал буфер для рендеринга глубины.
Когда я заменил этот код (буферы инициализации):

glGenFramebuffers(1, &mainFrameBufferId);

glGenRenderbuffers(1, &renderBufferId);
glBindRenderbuffer(GL_RENDERBUFFER, renderBufferId);
glRenderbufferStorage(GL_RENDERBUFFER,
GL_RGBA8,
camera.imageSize.width,
camera.imageSize.height);

glBindFramebuffer(GL_FRAMEBUFFER, mainFrameBufferId);
glFramebufferRenderbuffer(GL_FRAMEBUFFER,
GL_COLOR_ATTACHMENT0,
GL_RENDERBUFFER,
renderBufferId);
CV_Assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);

с этим:

glGenFramebuffers(1, &mainFrameBufferId);

glGenRenderbuffers(1, &renderBufferId);
glBindRenderbuffer(GL_RENDERBUFFER, renderBufferId);
glRenderbufferStorage(GL_RENDERBUFFER,
GL_RGBA8,
camera.imageSize.width,
camera.imageSize.height);

glBindFramebuffer(GL_FRAMEBUFFER, mainFrameBufferId);
glFramebufferRenderbuffer(GL_FRAMEBUFFER,
GL_COLOR_ATTACHMENT0,
GL_RENDERBUFFER,
renderBufferId);
CV_Assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);

glGenRenderbuffers(1, &depthRenderBufferId);
glBindRenderbuffer(GL_RENDERBUFFER, depthRenderBufferId);
glRenderbufferStorage(GL_RENDERBUFFER,
GL_DEPTH24_STENCIL8,
camera.imageSize.width,
camera.imageSize.height);

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderBufferId);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, depthRenderBufferId);

все стало работать нормально!

3

Решение

static int visualAttribs[] = { None };
^^^^
int numberOfFramebufferConfigurations = 0;
GLXFBConfig* fbConfigs = glXChooseFBConfig( display, DefaultScreen(display), visualAttribs, &numberOfFramebufferConfigurations );
CV_Assert(fbConfigs != 0);

glXChooseFBConfig():

GLX_DEPTH_SIZE: Должна следовать неотрицательная минимальная спецификация размера. Если это значение равно нулю, конфигурации кадрового буфера с нет буфера глубины являются предпочтительными. В противном случае предпочтительным является максимальный доступный буфер глубины, по крайней мере, минимального размера. Значением по умолчанию является 0.

Попробуйте установить visualAttribs[] что-то вроде { GLX_DEPTH_SIZE, 16, None }

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector