Рендеринг двух отдельных объектов, один объект не появляется на экране - PullRequest
0 голосов
/ 18 ноября 2018

Я пытаюсь создать случайную местность, окруженную скайбоксом, к которому я затем наложу текстуру.У меня есть 2 программы шейдеров, работающие взаимозаменяемо, но я не могу заставить скайбокс появляться на экране, в то время как ландшафт отображается нормально.

Ландшафт - это, по сути, сетка на плоскости xz, и каждая вершина имеет значение yгенерируется алгоритмом шума.Сетка является квадратной и имеет сторону SIDE.Я центрировал местность, используя смещение значений x и z, равное SIDE/2.

Скайбокс - это куб, у которого также есть сторона SIDE, поэтому он должен соответствоватьидеально с сеткой внутри нее, и должен быть виден, поскольку значения y вершин ландшафта малы по сравнению с SIDE или даже SIDE/2.

Это код:

GLfloat skyboxVertices[24] = {
    -HALF_SIDE, HALF_SIDE, -HALF_SIDE,   //A = 1
    HALF_SIDE, HALF_SIDE, -HALF_SIDE,    //B = 2
    HALF_SIDE, -HALF_SIDE, -HALF_SIDE,   //C = 3
    -HALF_SIDE, -HALF_SIDE, -HALF_SIDE,  //D = 4
    -HALF_SIDE, HALF_SIDE, HALF_SIDE,    //E = 5
    HALF_SIDE, HALF_SIDE, HALF_SIDE,     //F = 6 
    HALF_SIDE, -HALF_SIDE, HALF_SIDE,    //G = 7
    -HALF_SIDE, -HALF_SIDE, HALF_SIDE    //H = 8
};


//generating & binding skybox VAO
glGenVertexArrays(1, &skyboxVAO);
glBindVertexArray(skyboxVAO);

//creating & binding VBO for skybox vertices
glGenBuffers(1, &skyboxVBO);
glBindBuffer(GL_ARRAY_BUFFER, skyboxVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(skyboxVertices),
    skyboxVertices, GL_STATIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(0);


//3 indices per triangle, 2 triangles per side, 6 sides for a cube
//for a total of 36 
totalSkyboxElements = 36;

GLuint skyboxElements[36]{
    0, 1, 3, 3, 2, 0, //front
    4, 5, 1, 1, 0, 4, //up
    4, 5, 6, 6, 7, 4, //back
    7, 6, 3, 3, 2, 7, //bottom
    1, 5, 6, 6, 3, 1, //right
    0, 4, 7, 7, 2, 0  //left
};

//creating & binding VBO for skybox vertices
glGenBuffers(1, &skyboxElementsVBO);
glBindBuffer(GL_ARRAY_BUFFER, skyboxElementsVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(skyboxElements),
    skyboxElements, GL_STATIC_DRAW);

Код вершинного и фрагментного шейдеров выглядит следующим образом и компилируется и связывается без ошибок:

//vertex shader
#version 330 core

layout(location = 0) in vec3 position;

void main()
{
    gl_Position = vec4(position, 1.0);
}

//fragment shader
#version 330 core

out vec4 color;

void main()
{
   color = vec4(1.0, 1.0, 1.0, 1.0);
}

Наконец, в основном цикле код выглядит следующим образом.shaderProgramSB относится к скайбоксу, а shaderProgram относится к ландшафту

glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);

glUseProgram(shaderProgramSB);
glBindVertexArray(skyboxVAO);
glDrawElements(GL_TRIANGLES, totalSkyboxElements, GL_UNSIGNED_INT, 0);


glUseProgram(shaderProgram);

glBindVertexArray(terrainVAO);

camera->update();
projectionMatrix = camera->projectionMatrix;
viewMatrix = camera->viewMatrix;
modelMatrix = glm::mat4(1.0);
MVP = projectionMatrix * viewMatrix * modelMatrix;

glUniformMatrix4fv(MVPLocation, 1, GL_FALSE, &MVP[0][0]);


glDrawElements(GL_TRIANGLES, totalElements, GL_UNSIGNED_INT, 0);

Я пытался рендерить местность сначала, а затем скайбокс, но результат всегда одинаков.Рельеф рендерится нормально, скайбокс не рендерится вообще.Я искал и искал, но не могу найти проблему.Любая помощь с благодарностью.

...