Java OpenGL смешивая цвета изображения - PullRequest
0 голосов
/ 07 сентября 2010

Я пытаюсь смешать 2 изображения следующим образом:

Изображение 1 должно быть нарисовано как основное изображение.Изображение 2 должно быть нарисовано поверх изображения 1. Везде, где изображение 2 непрозрачно, оно должно заменять содержимое изображения 1 (не смешивать, а перезаписывать то, что там есть).Везде, где изображение 2 прозрачно, изображение 1 должно просвечивать.Я пытался сделать это с помощью следующего кода, но я, очевидно, что-то делаю неправильно со смешиванием.

            gl.glEnable(GL.GL_BLEND);
            if (iconTexture1 != null)
            {
                gl.glEnable(GL.GL_TEXTURE_2D);
                iconTexture1.bind();
                double red = (double) fillColor.getRed() / 255.0;
                double green = (double) fillColor.getGreen() / 255.0;
                double blue = (double) fillColor.getBlue() / 255.0;
                gl.glColor4d(red, green, blue, this.getOpacity());
                gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
                TextureCoords texCoords = iconTexture1.getImageTexCoords();
                gl.glScaled(width, height, 1d);
                dc.drawUnitQuad(texCoords);
            }
            if (iconTexture2 != null)
            {
                gl.glEnable(GL.GL_TEXTURE_2D);
                iconTexture2.bind();
                // image2 is all white, so color it here
                gl.glColor4d(1d, 0d, 0d, 1d);

                // TODO: What blend function should I be using here to allow image 2 to overwrite what is already there?

                TextureCoords texCoords = iconTexture2.getImageTexCoords();
                gl.glScaled(width, height, 1d);
                dc.drawUnitQuad(texCoords);
            }

Любая помощь, чтобы сделать эту работу правильно, будет оценена.Спасибо.

Джефф

1 Ответ

2 голосов
/ 07 сентября 2010

Есть несколько вещей, которые могут вызывать проблемы:

  1. Не следует включать функцию смешивания до тех пор, пока вы не нарисуете изображение 1. В этом случае изображение 1 будет смешано с тем, что было там.уже.
  2. Я не большой пользователь текстуры, но я думаю, что использование текстуры переопределит цвет четырехугольника, включая любую указанную вами альфу;поэтому, если у текстуры нет альфы, вы не получите смешения.
  3. Если у вас включена z-буферизация, возможно, изображение 2 находится позади изображения1;это затенило бы это, даже если изображение 2 прозрачно.Для рисования прозрачного 3d нужно использовать специальные методы.

Хороший способ работы с вещами OpenGL, которые, похоже, не работают, состоит в том, чтобы удалить всю сложность, а затем добавить ее обратно по крупицам,Текстура - ваша самая сложная часть - оставьте это до последнего.

...