c++ - 我的代码应该渲染立方体的正面,而不是显示背面。为什么?

标签 c++ visual-studio opengl glfw glew

我正在渲染这个立方体,它应该显示立方体的正面,但它显示背面(绿色)。我该如何解决这个问题?我已经坐了几个小时试图解决这个问题,但没有任何帮助。我正在尝试各种方法,例如更改三角形的渲染顺序,但也无济于事。谢谢你的帮助。这是我的代码。

float vertices[] =
{
    //front
    -0.5f, -0.5f, 0.0f,     1.f, 0.0f, 0.5f,
    0.5f, -0.5f, 0.0f,      1.f, 0.0f, 0.5f,
    0.5f, 0.5f, 0.0f,       1.f, 0.0f, 0.5f,
    -0.5f, 0.5f, 0.0f,      1.f, 0.0f, 0.5f,

    //back
    -0.5f/2, -0.5f/2, -0.5f,        0.0f, 1.f, 0.0f,
    0.5f/2, -0.5f/2, -0.5f,         0.0f, 1.f, 0.0f,
    0.5f/2, 0.5f/2, -0.5f,          0.0f, 1.f, 0.0f,
    -0.5f/2, 0.5f/2, -0.5f,         0.0f, 1.f, 0.0f,
};

unsigned int indices[] =
{
    //front
    0, 2, 3,
    0, 1, 2,
    //back
    4, 6, 7,
    4, 5, 6,
    //top
    3, 6, 2,
    3, 7, 6,
    //bottom
    0, 1, 5,
    0, 5, 4,
    //left
    3, 0, 4,
    3, 4, 7,
    //right
    1, 2, 5,
    2, 6, 5
    
};

int main()
{
    if (!glfwInit())
    {
        std::cout << "ERROR" << std::endl;
        return -1;
    }

    int width = 640;
    int height = 480;

    window = glfwCreateWindow(width, height, "OPENGL", NULL, NULL);

    if (!window)
    {
        std::cout << "ERROR: WINDOW" << std::endl;
    }

    glfwWindowHint(GLFW_SAMPLES, 4);
    glfwWindowHint(GLFW_VERSION_MAJOR, 4);
    glfwWindowHint(GLFW_VERSION_MINOR, 6);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    glfwMakeContextCurrent(window);
    glfwSwapInterval(1);

    if (glewInit() != GLEW_OK)
    {
        std::cout << "ERROR: GLEW" << std::endl;
    }

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);


    std::cout << "OpenGL " << glGetString(GL_VERSION) << std::endl;

    VertexArray va1;

    VertexBuffer vb1(vertices, sizeof(vertices), GL_STATIC_DRAW);
    IndexBuffer ib1(indices, sizeof(indices), GL_STATIC_DRAW);

    va1.linkAttrib(vb1, 0, 3, GL_FLOAT, 6 * sizeof(float), 0);
    va1.linkAttrib(vb1, 1, 3, GL_FLOAT, 6 * sizeof(float), 3 * sizeof(float));

    ShaderSources sources = parseShader("basic.shader");
    unsigned int program = createShaderProgram(sources.vertexSource, sources.fragmentSource);
    glUseProgram(program);

    while (!glfwWindowShouldClose(window))
    {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glDrawElements(GL_TRIANGLES, sizeof(indices) / sizeof(unsigned int), GL_UNSIGNED_INT, nullptr);
        glfwSwapBuffers(window);

        glfwPollEvents();
    }

    glfwDestroyWindow(window);
    glfwTerminate();
    return 0;
}

下面是立方体的样子: enter image description here

最佳答案

您目前正在使用 glEnable(GL_DEPTH_TEST)glDepthFunc(GL_LESS) ,这意味着只有 z 较小的片段(或 depth)组件在渲染重叠三角形时被渲染。由于您的顶点位置是用具有较小 z 的背面定义的坐标比正面,所有正面片段都将被忽略(因为它们的 z 坐标更大)。

解决方案是:

  • 使用 glDepthFunc(GL_GREATER)而不是 glDepthFunc(GL_LESS) (考虑到您的顶点有 z <= 0.0 并且深度缓冲区被清除为 0.0,这在您的情况下可能不起作用)
  • 修改你的顶点位置,使正面三角形更小 z组件比背面三角形。

我相信在使用矩阵变换时,较小的 z组件通常表示片段更接近 相机,这就是为什么 glDepthFunc(GL_LESS)经常使用。

关于c++ - 我的代码应该渲染立方体的正面,而不是显示背面。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71150895/

相关文章:

c++ - 如何在 Visual C++ 2019 社区中使用 c++20 std::is_constant_evaluated?

c++ - 一个函数可以在几个线程上运行吗?

.net - 从VB6到VS 2008(C#或VB)

opengl - 如何在 OpenGL 中使用多个视口(viewport)?

c++ - 求最大公约数的程序

c++ - 如何将一个 exe 项目链接到另一个 exe 项目中的类

c++ - OpenCV:代码执行无法继续,DLL 丢失

c++ - 如何使 Visual Studio 2013 显示未处理的异常消息?

c++ - OpenGL绘制多个对象的正确方法?

c++ - 将Qt4移植到Qt5,为OpenGL调用获取未解析的外部符号