GrizZzly-TerRor Дата: Пятница, 01 Марта 2013, 23:34 | Сообщение # 1
был не раз
Сейчас нет на сайте
Добрый день, изучаю OpenGL и попутно пишу 2D игру .Но у меня почему-то при рисовании 2х текстур они накладываются , и получается что большая текстура закрывает меньшую ( при равных X,Y). А хотелось бы что бы меньшая накладывалась сверху. При этом, еще существует текстурированный объект на все окно (фон), у которого такой проблемы нет. В общем, хотелось бы разместить ту большую текстуру между фоном и меньшей. Рисую все это так:
1) преамбула (вып. 1 раз в самом начале)
Код
GL11.glMatrixMode(GL11.GL_PROJECTION); GL11.glLoadIdentity(); GL11.glOrtho(0, Width, Height, 0, 1, -1); GL11.glMatrixMode(GL11.GL_MODELVIEW); GL11.glEnable(GL11.GL_DEPTH_TEST); GL11.glEnable(GL11.GL_TEXTURE_2D); GL11.glEnable(GL11.GL_ALPHA); GL11.glTexEnvi( GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_MODULATE );
2) Код печати фона
Код
GL11.glDisable(GL11.GL_DEPTH_TEST); GL11.glDepthMask(false); GL11.glLoadIdentity(); GL11.glMatrixMode(GL11.GL_PROJECTION); GL11.glPushMatrix(); GL11.glLoadIdentity(); GL11.glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0); GL11.glTexEnvf (GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_MODULATE); GL11.glMatrixMode(GL11.GL_MODELVIEW); Baground.bind(); GL11.glBegin(GL11.GL_QUADS); GL11.glTexCoord2f(0.0f, 0.0f);//1 GL11.glVertex2f(0.0f, 0.0f); GL11.glTexCoord2f(0.0f, 1.0f);//2 GL11.glVertex2f(0.0f, 1.0f); GL11.glTexCoord2f(1.0f, 1.0f);//3 GL11.glVertex2f(1.0f, 1.0f); GL11.glTexCoord2f(1.0f, 0.0f);//4 GL11.glVertex2f(1.0f, 0.0f); GL11.glEnd(); GL11.glMatrixMode(GL11.GL_PROJECTION); GL11.glPopMatrix(); GL11.glMatrixMode( GL11.GL_MODELVIEW); GL11.glPopMatrix(); GL11.glTexEnvf (GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_REPLACE); GL11.glDepthMask(true); GL11.glEnable(GL11.GL_DEPTH_TEST);
3) Печать "Обычного объекта".
Код
Ball.TexColor.bind(); GL11.glEnable(GL11.GL_BLEND); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); GL11.glColor4ub((byte) 255, (byte) 255, (byte)255, (byte)255); GL11.glBegin(GL11.GL_QUADS); GL11.glColor4f(1.0f,1.0f,1.0f,0.0f); GL11.glTexCoord2f(0,0); GL11.glVertex2i((int)Ball.getX()-ObjSize,(int)Ball.getY()-ObjSize); GL11.glTexCoord2f(1,0); GL11.glVertex2i((int)Ball.getX()-ObjSize,(int)Ball.getY()+ObjSize); GL11.glTexCoord2f(1,1); GL11.glVertex2i((int)Ball.getX()+ObjSize,(int)Ball.getY()+ObjSize); GL11.glTexCoord2f(0,1); GL11.glVertex2i((int)Ball.getX()+ObjSize,(int)Ball.getY()-ObjSize); GL11.glEnd(); GL11.glDisable(GL11.GL_BLEND);
4) Печать проблемного объекта
Код
GL11.glDisable(GL11.GL_DEPTH_TEST); GL11.glDepthMask(false); GL11.glLoadIdentity(); GL11.glMatrixMode(GL11.GL_PROJECTION); GL11.glPushMatrix(); GL11.glLoadIdentity(); GL11.glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0); GL11.glTexEnvf (GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_MODULATE); GL11.glMatrixMode(GL11.GL_MODELVIEW); GL11.glTexCoord2f(0,0); GL11.glVertex2i(Player.X-(int)Player.Size/2,Player.Y-(int)Player.Size/2); GL11.glTexCoord2f(1,0); GL11.glVertex2i(Player.X+(int)Player.Size/2,Player.Y-(int)Player.Size/2); GL11.glTexCoord2f(1,1); GL11.glVertex2i(Player.X+(int)Player.Size/2,Player.Y+(int)Player.Size/2); GL11.glTexCoord2f(0,1); GL11.glVertex2i(Player.X-(int)Player.Size/2,Player.Y+(int)Player.Size/2); GL11.glEnd(); //GL11.glDisable(GL11.GL_BLEND); GL11.glMatrixMode(GL11.GL_PROJECTION); GL11.glPopMatrix(); GL11.glMatrixMode( GL11.GL_MODELVIEW); GL11.glPopMatrix(); GL11.glTexEnvf (GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_REPLACE); GL11.glDepthMask(true); GL11.glEnable(GL11.GL_DEPTH_TEST);
Прошу подсказать что я делаю не так, и как добиться желаемого результата.
Archido Дата: Суббота, 02 Марта 2013, 06:54 | Сообщение # 2
Сэнсэй
Сейчас нет на сайте
Вообще для 2д Depth тест нафиг не нужен... Сделать в самом начале "GL11.glDisable(GL11.GL_DEPTH_TEST);" и больше его не включать. Тогда порядок расположения "текстур" будет зависить от порядка отрисовки. Т.е. то, что рисуется первым - будет находиться в самом низу, а что последним - соответственно наверху. Рисуем фон, потом большую текстуру, потом маленькую... и должно быть все ок.
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
GrizZzly-TerRor Дата: Суббота, 02 Марта 2013, 10:04 | Сообщение # 3
был не раз
Сейчас нет на сайте
Archido , Спасибо, получилось