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


12

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

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

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


Вы включили это в свой код: 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();              
}

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();
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.