Примітка. Я вже знайшов відповідь (яку я опублікую після цього запитання) - мені просто було цікаво, чи правильно я це роблю, чи є кращий спосіб.
Я роблю ізометричну гру «2.5D» за допомогою OpenGL ES (JOGL). Під "2.5D" я маю на увазі, що світ - 3D, але він відображається за допомогою 2D ізометричної плитки.
Первісна проблема, яку мені довелося вирішити, полягала в тому, що мої текстури мали бути викладені в порядку (зі спини вперед), щоб плитки перекривались належним чином, щоб створити належний ефект. Після деякого читання я швидко зрозумів, що це 2D підхід "старої шапки". Це стало важко зробити ефективно, оскільки 3D-світ може змінюватися програвачем (тому речі можуть з’являтися в будь-якому місці в 3D-просторі) - тому здавалося логічним, що я скористався перевагою буфера глибини. Це означало, що мені не доведеться турбуватися про те, щоб видати речі в правильному порядку.
Однак я зіткнувся з проблемою. Якщо ви використовуєте GL_DEPTH_TEST
і GL_BLEND
разом, він створює ефект , коли об'єкти змішується з фоном , перш ніж вони «упорядковано» по г порядку ( що означає , що ви отримаєте дивний вигляд перекриття , де прозорість повинна бути).
Ось якийсь псевдо-код, який повинен ілюструвати проблему (до речі, я використовую 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
// ...
}
Отже, питання полягає в тому, як вирішити проблему з перекриттям прозорості?