Буфер глубины не работает с несколькими шейдерными программами - PullRequest
0 голосов
/ 14 апреля 2019

Я пишу 3D-рендеринг графики на C ++, используя OpenGL-ES для портативной системы, и я использую шейдер (текстурный), а также шейдер с цветовой заливкой.У меня есть два прохода рендеринга, где я использую соответствующую программу и использую буферы Array / Element для рисования данных с использованием glDrawElements.

Хотя я включаю GL_DEPTH_TEST в своем приложении, мои многоугольники декалей всегда рендерится перед моими закрашенными цветом многоугольниками.

Я пытался переделать, как мои матрицы проекции / modelView строятся и передаются шейдерам, я пробовал разные параметры glDepthFunc, но я не могу заставить их правильно отображаться.

Этомой код рисования - я начинаю каждый кадр с

glClearColor(0.25f, 0.25f, 0.25f, 1.f);
glClearDepthf(1.f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

Затем я вычисляю координаты многоугольника мирового пространства и распределяю его по векторам GLfloat.Сначала я рисую данные декали:

GLuint programId = decalProgramId;
glUseProgram(programId);

// All of my uniform params are setup here - omitting to save space

// Set proj/mv matrices
glUniformMatrix4fv(glGetUniformLocation(programId, "uProjection"), 1, GL_TRUE, static_cast<f32*>(gameEngine.proj));
glUniformMatrix4fv(glGetUniformLocation(programId, "uModelView"), 1, GL_TRUE, static_cast<f32*>(gameEngine.modelView));

// Then I prepare the buffer data
glBindBuffer(GL_ARRAY_BUFFER, decalBufferId);
glBufferData(GL_ARRAY_BUFFER, coordSize + texCoordSize, 0, GL_STATIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, coordSize, &coords[0]);
glBufferSubData(GL_ARRAY_BUFFER, coordSize, texCoordSize, &texCoords[0]);

// And element array buffer data
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, decalElementBufferId);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexSize, &indices[0], GL_STATIC_DRAW);

// Enable our vertex attributes
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)(coordSize));

// Bind my test texture
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureId);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

// Draw the elements
glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_SHORT, 0);

Затем процесс повторяется с моими цветными полигонами.Далее следуют команды SwapBuffer и WaitVSync.

Вот мой код для создания одного из треугольников и лицевой стороны куба:

// Add polygon directly to the scene object
scene.AddPolygon(polygonBuilder
    .AddVertex(Vector3(0.5f, 0.5f, 0.f), Vector4(0.f, 0.f, 1.f, 1.f))
    .AddVertex(Vector3(0.25f, 0.f, 0.f), Vector4(0.f, 1.f, 0.f, 1.f))
    .AddVertex(Vector3(0.75f, 0.f, 0.f), Vector4(1.f, 0.f, 0.f, 1.f))
    .AddIndex(0).AddIndex(1).AddIndex(2)
    .Build()
);

// Create a polygon within the crate object
crateObject.AddPolygon(polygonBuilder
    .AddVertex(Vector3(-0.25f, 0.25f, 0.f), Vector2(0.f, 0.f))
    .AddVertex(Vector3(-0.25f, -0.25f, 0.f), Vector2(0.f, 1.f))
    .AddVertex(Vector3(0.25f, -0.25f, 0.f), Vector2(1.f, 1.f))
    .AddVertex(Vector3(0.25f, 0.25f, 0.f), Vector2(1.f, 0.f))
    .SetTexture("crate")
    .AddIndex(0).AddIndex(1).AddIndex(3)
    .AddIndex(3).AddIndex(1).AddIndex(2)
    .Build()
);

// Add the crate object as a child within the scene
scene.AddChild(crate);

Этот снимок экрана является текущим выводом при создании двухцветные треугольники и один текстурированный куб:

Render Error

Синяя стрелка указывает на треугольник, который должен был отображаться спереди.Есть идеи?

1 Ответ

0 голосов
/ 14 апреля 2019

Теперь я чувствую себя очень глупо. Мой цветовой шейдер неправильно применял матрицу вида модели. Он всегда рендерился на фиксированной глубине.

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

Working Render

...