【问题标题】:What is a simple way to brighten textures mapped to a quad in OpenGL ES?什么是在 OpenGL ES 中使映射到四边形的纹理变亮的简单方法?
【发布时间】:2011-07-02 07:33:14
【问题描述】:

我正在显示使用应用于四边形的多个纹理(具有透明度)构建的 2D 精灵。我已经为 glDrawArrays 启用了颜色数组,并且知道如何使用它来更改每种颜色的比例并使纹理变暗(即,将所有颜色减少相同的量)。

这一切都是使用预乘 alpha 和以下内容完成的:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

是否也有一种简单的方法可以使纹理变亮?

我尝试使用 GL_ADD,但这会导致整个四边形变得可见(即,以前透明的像素不再存在)。

谢谢。

【问题讨论】:

    标签: opengl-es colors


    【解决方案1】:

    这很简单:在您想要变亮的区域上绘制另一个四边形,使用该叠加四边形

    glBlendFunc(GL10.GL_DST_COLOR, GL10.GL_ONE);
    

    其中effectively 表示您采用基础颜色(dst,GL_ONE),并添加相同颜色的另一部分(src,GL10.GL_DST_COLOR)。

    您添加的分数由四边形的颜色指定,因此您现在可以通过将叠加四边形的顶点颜色设置为 {0.0f, 0.0f, 0.0f}(不增亮)到 {1.0f, 来调整亮度, 1.0f, 1.0f}(“加倍”亮度)。当然,您也可以通过调整因素来增加单个颜色的亮度。

    祝你好运!

    干杯,艾特。

    【讨论】:

    • 这不会导致完全透明的像素不再透明吗?
    • 不,它不会改变你正在绘制的精灵!你只是在它上面覆盖了一个明亮的四边形。
    • 我目前正在使用不同的混合函数来防止我的预乘 Alpha 纹理出现伪影(GL_ONE、GL_ONE_MINUS_SRC_ALPHA)。我假设我会将 BlendFunc 更改为您推荐的内容,然后返回以保持我现有的行为。我正在使用 glDrawArrays 来减少绘图调用,所以我必须了解它是如何与这种 OGL-ES 编码风格一起工作的。您推荐与 glDrawArrays(或 glDrawElements)混合的任何提示或示例将不胜感激,因为我在其他地方没有找到。无论如何,感谢您的回复。
    • 是的,您必须对这些覆盖四边形进行单独的绘制调用,因为您必须在两者之间切换状态机。所以你会有 (1) glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA), (2) glDrawElements(sprites) (3) glBlendFunc(GL_DST_COLOR, GL_ONE) (4) glDrawElements(brightening quads)。除非你有几十个,否则不必担心额外的绘制调用。或者,您可以使用多重纹理,请参阅 [softwareprodigy.blogspot.com/2009/08/… 以获得一个很好的示例。这与一个四边形实现相同,但设置起来有点棘手。干杯!
    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多