Я пытаюсь создать случайную местность, окруженную скайбоксом, к которому я затем наложу текстуру.У меня есть 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);
Я пытался рендерить местность сначала, а затем скайбокс, но результат всегда одинаков.Рельеф рендерится нормально, скайбокс не рендерится вообще.Я искал и искал, но не могу найти проблему.Любая помощь с благодарностью.