Примечание: Я уже нашел ответ (который я вывешу после этого вопроса) - мне было просто интересно , если я делаю это правильно, или если есть лучший способ.
Я делаю "2.5D" изометрическую игру с использованием OpenGL ES (JOGL). Под «2.5D» я подразумеваю, что мир трехмерен, но он визуализируется с использованием 2D-изометрических плиток.
Первоначальная проблема, которую мне пришлось решить, заключалась в том, что мои текстуры должны были отображаться по порядку (сзади), чтобы плитки перекрывались правильно, чтобы создать нужный эффект. После некоторого прочтения я быстро понял, что это 2D-подход "старой шляпы". Это стало трудно сделать эффективно, так как 3D мир может быть изменен игроком (так вещи могут появляться в любом месте в 3D пространстве) - так что казалось логичным, что я воспользоваться буфером глубины. Это означало, что я не должен беспокоиться об оказании вещи в правильном порядке.
Однако я столкнулся с проблемой. Если вы используете GL_DEPTH_TEST
и GL_BLEND
вместе, это создает эффект, когда объекты смешиваются с фоном, прежде чем они будут «отсортированы» по z-порядку (это означает, что вы получаете странный вид перекрытия, где должна быть прозрачность).
Вот некоторый псевдокод, который должен проиллюстрировать проблему (кстати, я использую libgdx для Android).
create() {
// ...
// some other code here
// ...
Gdx.gl.glEnable(GL10.GL_DEPTH_TEST);
Gdx.gl.glEnable(GL10.GL_BLEND);
}
render() {
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
Gdx.gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
// ...
// bind texture and create vertices
// ...
}
Итак, вопрос: как мне решить проблему перекрытия прозрачности?