Как мне рендерить PNG с прозрачностью в LibGDX?

12

Я строю простой пример крестики-нолики с LibGDX. У меня есть простые изображения: крест, круг и доска, все они pngсозданы с помощью GIMP с прозрачным фоном.

Как я могу сделать их Textureпрозрачными?

Я пробовал с функцией включения GL10, но, похоже, не работает.

Vokail
источник
Вы включили это в свой код: Gdx.gl.glClearColor (1, 1, 1, 1); Gdx.gl.glClear (GL10.GL_COLOR_BUFFER_BIT);
LeSam
поместите это в цикл рендеринга
LeSam
Это должно работать нормально (делает для меня). С какой конкретной проблемой вы столкнулись?
ashes999
Ваше утверждение: «У меня есть простые изображения: крестик, круг и доска - все png, созданные с gimp с альфа-каналом в качестве цвета». можно интерпретировать многими различными способами, от прозрачности цветового ключа до предварительно умноженной альфа. Можете ли вы уточнить, что вы имеете в виду? Как правило, вам понадобится либо альфа-смешивание (альфа-прозрачность), либо альфа-тестирование (альфа-маска); ни одна из этих вещей не включена по умолчанию, а вторая не поддерживается в современном OpenGL.
Андон М. Коулман

Ответы:

2

Создайте Sprite и присвойте ему текстуру, затем используйте Sprite setColor, чтобы настроить его альфа, например,

Texture yourTexture = new Texture("image.png");
sprite = new Sprite(yourTexture);
//RGBA
sprite.setColor(1, 0, 0, 0.2f);

и в цикле render () используйте SpriteBatch

sprite.draw(spriteBatch);
Даниил
источник
Обратите внимание, что SpriteBatch использует DefaultShader, если вы хотите, чтобы вы написали свой собственный шейдер для контроля прозрачности, и, конечно, вы должны включить OpenGL ES 2.0 для этого.
Даниэль
1

Если вы положите

Gdx.gl.glClearColor(0, 0, 0, 1); 
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 

в начале цикла render () необходимо обновить экран черным цветом. Так что, если какие-либо изображения имеют прозрачность, это будет заметно.

так что ваш цикл render () может выглядеть так

public void render(float delta) {
  Gdx.gl.glClearColor(0, 0, 0, 1);
  Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

  // Update logic & etc.        

  batch.begin();

  // Place your render calls
  // In this I use a Sprite object named "sprite" and all you need to do is call .draw();
  // on it and it will render at 0,0, unless told differently with .setPosition();

  sprite.draw(batch);

  batch.end();              
}
CNIAngel
источник
0

Я также попытался отрисовать .png с прозрачностью. С базовой настройкой (смешивание не активировано) он не рендерился должным образом.

Я никогда не активировал смешивание, но я добавил это:

Gdx.gl.glClear(GL20.GL_ALPHA_BITS);

Моя проблема была в том, что альфа никогда не очищалась. Это означает, что если бы я рендерил с альфа 0,1, потребовалось бы 10 кадров, пока альфа не будет «сложена» обратно до 1. Добавление вышеупомянутого вызова очистило альфу, как вы бы очистили цвет.

Я знаю, что это старый вопрос, поэтому решения тогда были другими. enableBlending все еще должен работать, но я не уверен, предотвращает ли это «наложение» альфы. Очистка альфа-битов, пожалуй, самый простой способ предотвратить надежный внешний вид.

Что касается фактического рендеринга, это то же самое, что и всегда.

//Viewport, camera, logic, etc
batch.begin();
//draw your image(s) here
batch.end();

источник