Почему исчезает объект, когда я включаю тест глубины?

Рейтинг: 0Ответов: 0Опубликовано: 19.04.2023

Пока что я нарисовал переднюю и заднюю часть куба, используя glDrawElements. Задняя часть рисуется впереди и поэтому я решил включить тест глубины, используя glEnable(GL_DEPTH_TEST). После этого действия на экране вообще ничего не стало отображаться. Что пошло не так? Рисование происходит в методе draw.

#include <iostream>

#define SDL_MAIN_HANDLED
#include <SDL.h>

#define GLEW_STATIC
#include <GL/glew.h>

#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>

#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 600

GLuint shaderProgram;

void draw()
{
    glm::mat4 Projection = glm::perspective(glm::radians(45.0f), (float)WINDOW_WIDTH / (float)WINDOW_HEIGHT, 0.1f, 100.0f);
    glm::mat4 View = glm::lookAt(
        glm::vec3(3, 2, 4),
        glm::vec3(0, 0, 0),
        glm::vec3(0, 1, 0)
    );
    glm::mat4 Model = glm::mat4(1.0f);
    GLuint matrixId = glGetUniformLocation(shaderProgram, "mvp");
    GLuint colorId = glGetUniformLocation(shaderProgram, "inColor");
    glm::mat4 mvp = Projection * View * Model;
    glUniformMatrix4fv(matrixId, 1, GL_FALSE, &mvp[0][0]);
    glEnable(GL_DEPTH_TEST);
    glDrawElements(GL_TRIANGLES, 12, GL_UNSIGNED_INT, 0);
    glDisable(GL_DEPTH_TEST);
}

int main()
{
    SDL_Init(SDL_INIT_VIDEO);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
    SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);
    SDL_Window* window = SDL_CreateWindow("OpenGL Draw", 100, 100, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_OPENGL);

    SDL_GLContext context = SDL_GL_CreateContext(window);

    glewExperimental = GL_TRUE;
    glewInit();

    GLuint vao;
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);

    float vertices[] =
    {
        -0.5f, 0.5f, 0.0f, 1, 0, 0,
        0.5f, 0.5f, 0.0f, 0, 1, 0,
        0.5f, -0.5f, 0.0f, 0, 0, 1,
        -0.5f, -0.5f, 0.0f, 1, 1, 1,

        -0.5f, 0.5f, -0.5f, 1, 0, 0,
        0.5f, 0.5f, -0.5f, 0, 1, 0,
        0.5f, -0.5f, -0.5f, 0, 0, 1,
        -0.5f, -0.5f, -0.5f, 1, 1, 1,
    };
    GLuint vbo;
    glGenBuffers(1, &vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    unsigned int indices[] =
    {
        0, 1, 2, // front
        2, 3, 0,

        4, 5, 6, // back
        6, 7, 4,
    };
    GLuint ebo;
    glGenBuffers(1, &ebo);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

    const char* vertexSource = R"glsl(
        #version 150 core
        in vec3 position;
        in vec3 color;
        out vec3 Color;
        uniform mat4 mvp;
        void main()
        {
            Color = color;
            gl_Position = mvp * vec4(position, 1.0);
        }
    )glsl";
    GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShader, 1, &vertexSource, NULL);
    glCompileShader(vertexShader);

    const char* fragmentSource = R"glsl(
        #version 150 core
        in vec3 Color;
        out vec4 outColor;
        void main()
        {
            outColor = vec4(Color, 1.0);
        }
    )glsl";
    GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShader, 1, &fragmentSource, NULL);
    glCompileShader(fragmentShader);

    shaderProgram = glCreateProgram();
    glAttachShader(shaderProgram, vertexShader);
    glAttachShader(shaderProgram, fragmentShader);
    glLinkProgram(shaderProgram);
    glUseProgram(shaderProgram);

    GLint posAttrib = glGetAttribLocation(shaderProgram, "position");
    glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GL_FLOAT), 0);
    glEnableVertexAttribArray(posAttrib);
    GLint colorAttrib = glGetAttribLocation(shaderProgram, "color");
    glVertexAttribPointer(colorAttrib, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GL_FLOAT), (void*)(3 * sizeof(GL_FLOAT)));
    glEnableVertexAttribArray(colorAttrib);

    SDL_Event windowEvent;
    while (true)
    {
        if (SDL_PollEvent(&windowEvent))
        {
            if (windowEvent.type == SDL_QUIT) break;
        }
        else
        {
            draw();
            SDL_GL_SwapWindow(window);
        }
    }
    SDL_GL_DeleteContext(context);
    SDL_Quit();
    return 0;
}

введите сюда описание изображения

Ответы

Ответов пока нет.