0

我正在尝试通过以下方式将 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);
            }

任何有助于使这项工作正常工作的帮助将不胜感激。谢谢。

杰夫

4

1 回答 1

2

有几件事可能是问题:

  1. 在绘制图像 1 之前,您不应该打开混合功能。之前这样做会将图像 1 与已经存在的任何内容混合。
  2. 我不是纹理的大用户,但我认为使用纹理会覆盖四边形的颜色,包括您指定的任何 alpha;所以除非纹理有 alpha,否则你不会得到任何混合。
  3. 如果您启用了 z 缓冲,那么图像 2 可能在图像 1 后面;即使图像 2 是透明的,这也会使其模糊。必须使用特殊的方法来绘制透明的 3d。

处理似乎不起作用的 OpenGL 事物的一个好方法是消除所有复杂性,然后将其一点一点地添加回来。纹理是你最复杂的部分——把它留到最后。

于 2010-09-07T16:51:26.020 回答