java+JOGL, как установить прозрачность для отображения объектов в сцене вместо простого черного цвета при рисовании текстуры?

Мы пишем простую 3D-игру в качестве проекта на курсе, который мы изучаем в университете. (задание для пар) мы должны использовать JOGL, поэтому я должен работать с этим API (такие решения, как: переключиться на более высокий уровень API, такой как java3D, не будут будь добр...) в любом случае, игра, которую мы решили реализовать, представляет собой своего рода 3D-шутер. (код на данный момент, который является ответвлением предыдущего задания, которое мы сделали для того же курса, можно найти здесь: http://code.google.com/p/mirzhcode/source/browse/?repo=cgex4 ) и сейчас пытаюсь разобраться со "спецэффектами". точнее, частицы и спрайты (для стрельбы, взрывов и т. д.). Я наткнулся на объяснение относительно эмиттеров спрайтов, которые хочу реализовать: http://bit.ly/KrrPM4

Я начал с того, что казалось самым легким. ударно-волновое кольцо, состоящее из одного быстрорастущего спрайта. когда я пытаюсь нарисовать изображение, которое я сделал, я получаю черный фон вместо прозрачности, которую я хотел. изображение текстуры представляет собой прозрачный png-файл (так что есть альфа-канал) shockwave png-файл с альфа-прозрачностьюи что я получить от него: введите описание изображения здеськод, который я использовал для создания этого:

в методе init():

//loading textures
try {
    shockwave = TextureIO.newTexture(new File( "textures/shockwave_128X128.png" ),false);
} catch (GLException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

gl.glShadeModel(GL.GL_SMOOTH);
gl.glClearColor(0f, 0f, 0f, 1f);
gl.glClearDepth(1.0);
gl.glEnable(GL.GL_BLEND);
gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE);
gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);
gl.glHint(GL.GL_POINT_SMOOTH_HINT, GL.GL_NICEST);
gl.glEnable(GL.GL_TEXTURE_2D);
gl.glEnable(GL.GL_DEPTH_TEST);

//UNCOMMENT THE FOLLOWING LINE OF CODE
//FOR REALISTIC COLORS. NOTE THAT ICC
//BUTTON WON'T CHANGE THE COLORS ANYMORE.

//gl.glEnable(GL.GL_LIGHTING);

//two (soft) lights (red and blue) setup.
//each in an opposite corner of the room.
float color0[] = {1f, 0f, 0f, 0.5f};
float ambient0[] = {1.0f, 1.0f, 1.0f, 0.5f};
float position0[] = {(float) (0.95*expansionFactor), (float) (0.95*expansionFactor), (float) (0.95*expansionFactor)};

float color1[] = {0f, 0f, 1f, 0.5f};
float ambient1[] = {1.0f, 1.0f, 1.0f, 0.5f};
float position1[] = {(float) (0.95*expansionFactor), (float) (0.95*expansionFactor), (float) (0.95*expansionFactor)};

gl.glLightfv(GL.GL_LIGHT0, GL.GL_AMBIENT, ambient0,1); 
gl.glLightfv(GL.GL_LIGHT0, GL.GL_DIFFUSE,color0 , 1); 
gl.glLightfv(GL.GL_LIGHT0, GL.GL_SPECULAR, color0 , 1); 
gl.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, position0, 1);

gl.glLightfv(GL.GL_LIGHT1, GL.GL_AMBIENT, ambient1,1); 
gl.glLightfv(GL.GL_LIGHT1, GL.GL_DIFFUSE,color1 , 1); 
gl.glLightfv(GL.GL_LIGHT1, GL.GL_SPECULAR, color1 , 1); 
gl.glLightfv(GL.GL_LIGHT1, GL.GL_POSITION, position1, 1);

gl.glEnable(GL.GL_LIGHT0);
gl.glEnable(GL.GL_LIGHT1);

start();

а также в методе display():

gl.glEnable(GL.GL_BLEND);
gl.glClear(GL.GL_COLOR_BUFFER_BIT);
gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
shockwave.bind();

gl.glColor4f(1f,1f,1f,1f);

gl.glBegin(GL.GL_QUADS);
gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3d(0.0-10, 0.2, 0.0-10);
gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3d(0.0+10, 0.2, 0.0-10);
gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3d(0.0+10, 0.2, 0.0+10);
gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3d(0.0-10, 0.2, 0.0+10);
gl.glEnd();

Подводя итог, мой вопрос заключается в том, как заставить текстуру использовать ее альфа-канал, и если это не так просто, есть ли библиотека, которую вы, возможно, знаете, которую я могу использовать?


person gilad hoch    schedule 15.06.2012    source источник


Ответы (1)


Покопавшись еще немного, я понял, что мне нужно сделать. очевидно, когда вы смешиваете изображения с помощью openGL, они смешиваются с кадром, визуализируемым до сих пор. поэтому порядок рисования важен. Я визуализировал это изображение в начале метода отображения, и я должен был поместить это в конец. так что в любом случае, если кто-то хочет знать, как рисовать прозрачные объекты, убедитесь, что вы рисуете их в последнюю очередь. в случае, если есть прозрачные объекты numeros, вы должны нарисовать их по порядку. дальше от камеры следует рисовать в первую очередь. после исправления

person gilad hoch    schedule 15.06.2012