【问题标题】:Java OpenGL blending image colorsJava OpenGL 混合图像颜色
【发布时间】:2010-12-25 06:26:30
【问题描述】:

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

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

杰夫

【问题讨论】:

    标签: java opengl jogl blending


    【解决方案1】:

    有几件事可能是问题:

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

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

    【讨论】:

    • 感谢您的浏览。我确实想将图像与这种情况下已经存在的任何东西混合在一起。我也在相同的 z 坐标上绘图,但我基本上只是想弄清楚如何覆盖当前像素(如果有意义的话)。
    • 更新:我能够通过使用两遍渲染技术解决这个问题。虽然我确信有更多方法可以使用多纹理一起优化纹理的渲染,但这是我正在做的一件小事,因为我现在有了一个可行的解决方案,所以不值得再投入任何时间。感谢您的帮助,慢慢退出更改有所帮助,因此为您提供正确答案。
    • 可能值得写下您自己实际所做的事情作为答案,并接受这一点。这样一来,任何通过 Google 访问的人都可以看到实际的解决方案以及找到它的方法。
    • 您是否最终禁用了其中一个通道的 Z 缓冲区,如红皮书关于如何绘制透明度的描述中所述?这就是我对第 3 项的暗示,但我不是很明确。
    • 出于某种原因,我从未在这里注意到您的评论。是的,我确实为其中一个通道禁用了 z 缓冲区。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 2020-09-25
    相关资源
    最近更新 更多