OpenGL无法进行Z缓冲区和深度测试

时间:2019-03-05 17:51:28

标签: c++ opengl sfml

我一直在努力使用OpenGL的Z缓冲区,但我无法使其正常工作。 这是代码(我将其范围缩小到显示问题所需的最低限度):

#include <stdio.h>
#include <stdlib.h>
#include <glad\glad.h>
#include <SFML\Graphics.hpp>

#define WIDTH 800
#define HEIGHT 600

int main(void) {
  sf::ContextSettings settings;
  settings.antialiasingLevel = 16;
  settings.majorVersion = 4;
  settings.minorVersion = 6;
  sf::RenderWindow window(sf::VideoMode(WIDTH, HEIGHT), "Test", sf::Style::Close, settings);

  if (!gladLoadGL()) {
    printf("COULD NOT INITALIZE OPENGL CONTEXT\n");
  }

  window.setActive(true);
  window.setVerticalSyncEnabled(true);

  glClearColor(0.1f, 0.1f, 0.1f, 1.0f);

  glEnable(GL_DEPTH_TEST);

  glDepthFunc(GL_LESS);

  while (window.isOpen()) {
    sf::Event event;
    while (window.pollEvent(event)) {
      if (event.type == sf::Event::Closed) {
        window.close();
      }
    }

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glBegin(GL_TRIANGLES);
      glColor3f(1.0f, 0.0f, 0.0f); // red
      glVertex3f(-1.0f, -1.0f, 0.25f); // first triangle
      glVertex3f( 1.0f, -1.0f, 0.25f);
      glVertex3f( 0.0f,  1.0f, 0.25f);

      glColor3f(0.0f, 0.0f, 1.0f); // blue
      glVertex3f(-1.0f,  1.0f, 0.5f); // second triangle
      glVertex3f( 1.0f,  1.0f, 0.5f);
      glVertex3f( 0.0f, -1.0f, 0.5f);
    glEnd();

    window.display();
  }

  return(0);
}

输出: enter image description here

蓝色三角形位于红色的顶部,原因是我将其绘制为第二个,即使它应留在后面。 我首先在我的主要OpenGL项目中注意到了此行为,在该项目中,我将导入3D模型,并且将三角形呈现在其他对象的前面,这表明Z-Buffer并未执行其操作。 我尝试了许多解决方案,例如启用GL_CULL_FACE,从投影矩阵(在3d项目中)使用近平面进行操作,但似乎没有任何效果。我在网上发现的几乎每个人都可以使用的修复程序似乎都不适用于我,所以我有点拼命... 如果有人知道这个问题,请告诉我!

3 个答案:

答案 0 :(得分:1)

如@Quimby所评论,可以找到解决方案here

问题在于SFML需要您通过窗口设置来设置深度缓冲区。

答案 1 :(得分:0)

已经有一段时间了,但是我认为这不是Z缓冲区的问题。 OpenGL使用右手坐标系,正Z远离屏幕。因此,具有较大z值的蓝色三角形意味着它应该在前面。较小的z值应该更远吧?所以我相信这是正确的行为。

答案 2 :(得分:0)

这对我来说似乎是正确的输出。与DirectX相比,OpenGL的Z轴翻转了。因此+1位于前面,-1位于后面,因此“相机”朝Z负方向看。