Java OpenGL混合图像颜色

时间:2010-09-07 14:33:47

标签: java opengl jogl blending

我试图通过以下方式将两个图像混合在一起:

应将图像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 个答案:

答案 0 :(得分:2)

可能存在一些问题:

  1. 在绘制图像之前,不应打开混合功能1.之前这样做会将图像1与已存在的图像混合。
  2. 我不是一个大纹理用户,但我认为使用纹理会覆盖四边形的颜色,包括你指定的任何alpha;因此,除非纹理具有alpha,否则您将无法进行任何混合。
  3. 如果启用了z缓冲,那么图像2可能位于image1之后;即使图像2是透明的,也会使它模糊不清。必须使用特殊方法绘制透明的3d。
  4. 使用似乎不起作用的OpenGL的一个好方法是消除所有复杂性,然后一点一点地添加它。纹理是你最复杂的部分 - 留下直到最后。