【问题标题】:How to render a texture with alpha?如何使用 alpha 渲染纹理?
【发布时间】:2011-11-12 00:40:34
【问题描述】:

如何用 alpha 渲染纹理?

我有一个纹理,需要在不同位置使用不同的 alpha 值对其进行渲染。有什么办法吗? (我的纹理是 GL_RGBA)

如果不能即时更改 alpha 值,我必须为不同的 alpha 级别创建不同的纹理吗?

【问题讨论】:

  • 什么结构保存图像?
  • 我有一个 DIB 数据(从 HBITMAP 转换而来),然后我从 DIB 创建纹理,但是在创建纹理后立即删除了 DIB 数据。 (即:免费(dib_data_handle);)

标签: c++ visual-c++ opengl textures alpha


【解决方案1】:

首先,确保您的纹理具有 Alpha 通道。您提到您正在加载 RGBA 格式,但在图像编辑程序中检查原始文件总是好的。然后确保您的纹理已准备好在 openGL 中进行渲染。一个常见的错误是忘记通过glTexParameter* 设置纹理的过滤模式。它从需要 mipmap 的设置开始,所以我发现它最容易开始:

glTexParameteri(GL_TEXTURE_2D, GL_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_MAG_FILTER, GL_LINEAR);

其次,您需要设置 openGL 以准备好进行混合。这涉及到glEnable 调用与GL_BLENDglBlendFunc 调用。大多数情况下,您会希望函数调用为glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA),因为大多数其他标记组合会给您带来您不想要的效果(有关更多信息,请参阅glBlendFunc 规范页面)。

最后,确保您在不同点对纹理进行采样。如果您使用即时模式(您正在使用glVertex* 绘制场景),您将需要使用glTexGen* 或在调用glVertex* 之前使用glTexCoord* 手动指定纹理点。如果使用数组数据绘制场景,请确保已使用 glEnableClientState(GL_TEXTURE_COORD_ARRAY)glTexCoordPointer 启用纹理指针。

【讨论】:

    【解决方案2】:

    您的纹理是 GL_RGBA,因此它具有每个纹素的不同 alpha 值。

    如果你想改变用于渲染的alpha值,我可以想到以下方法:

    • 更改纹理 Alpha 值(不确定您是否说不想这样做)。
    • 使用glColor4f 更改顶点的alpha 值。它将乘以纹理值。您可能需要使用glEnable(GL_COLOR_MATERIAL) 和/或glColorMaterial()
    • 使用顶点着色器更改顶点 Alpha 值。它将乘以纹理值。
    • 使用片段着色器动态更改采样的纹理值。
    • 使用两个纹理阶段并将它们相乘。第二个将具有修改后的 alpha 值(请参阅 glActiveTexture() 和朋友)。
    • 使用片段着色器和两个(或更多)纹理阶段。这是最酷的!

    【讨论】:

    • 我想要的是将每个像素的 alpha 减少一半,我应该选择哪种解决方案?
    • 只要启用了颜色,glColor4f(1,1,1, 0.5f) 就应该这样做。
    • 是否需要开启GL_BLEND,生成纹理时必须使用GL_MODULATE?
    • 可能是的,是的。此外,如果您启用了 GL_LIGHTING,您还需要启用 GL_COLOR_MATERIAL,所以 glColor 会做一些有用的事情。
    猜你喜欢
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多