Затем я добавил простой этап постобработки с использованием вычислительных шейдеров, что привело к сбою тестирования глубины, хотя все остальное работает. Если просто удалить постобработку, тестирование глубины снова заработает.
Вот основной метод рендеринга:
Код: Выделить всё
public void render() {
post.start();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_DEPTH_TEST); // Breaks when using post processing
for (Mesh m : meshes) {
if (m.doDepthTest()) {
ShaderProgram p = m.getShader();
p.use();
uploadUniform(p);
m.render();
p.unuse();
}
}
glDisable(GL_DEPTH_TEST);
for (Mesh m : meshes) {
if (!m.doDepthTest()) {
ShaderProgram p = m.getShader();
p.use();
uploadUniform(p);
m.render();
p.unuse();
}
}
post.runPostProcess();
glfwSwapBuffers(window);
glfwPollEvents();
}
Код: Выделить всё
public void start() {
glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
glViewport(0, 0, width, height);
}
Код: Выделить всё
public void runPostProcess() {
computeProgram.use();
glBindImageTexture(0, renderedTexture, 0, false, 0, GL_READ_ONLY, GL_RGBA32F);
glBindImageTexture(1, processedTexture, 0, false, 0, GL_WRITE_ONLY, GL_RGBA32F);
glDispatchCompute((int) Math.ceil(width / 16.0), (int) Math.ceil(height / 16.0), 1);
glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
computeProgram.unuse();
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glClear(GL_COLOR_BUFFER_BIT);
quadProgram.use();
glBindTexture(GL_TEXTURE_2D, processedTexture);
renderFullscreenQuad();
quadProgram.unuse();
}
Я пробовал менять местами при использовании шейдеров, при очистке буфера глубины и при привязке фреймбуфера, но ничего не помогло.
Подробнее здесь: https://stackoverflow.com/questions/787 ... processing