2010-09-07 4 views
0

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

Изображение 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); 
      } 

Любая помощь для правильной работы будет оценена по достоинству. Благодарю.

Джефф

ответ

2

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

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

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

+0

Спасибо, что посмотрели. Я действительно хотел смешать изображение с тем, что уже было в этом случае. Я также рисую одну и ту же координату z, но в основном я просто пытаюсь понять, как сделать переписывание текущих пикселей (если это имеет смысл). –

+0

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

+0

Возможно, стоит написать то, что вы на самом деле сделали как ответ, и принять это. Таким образом, любой, кто приходит к этому через Google, видит фактическое решение, а также метод его поиска. – DJClayworth

Смежные вопросы