2011-09-07 88 views
1

如何使用alpha渲染纹理?如何渲染带有alpha的纹理?

我有一个纹理,需要在不同的位置使用不同的alpha值来渲染它。任何方式来这样做? (我的纹理是GL_RGBA)

如果无法在飞行中更改alpha值,我必须为不同的alpha级别创建不同的纹理?

+1

什么结构保存图像? –

+0

我有一个DIB数据(从HBITMAP转换而来),然后我从DIB创建纹理,但是创建纹理之后刚刚删除了DIB数据。 (即:免费(dib_data_handle);) – jondinham

回答

2

您的纹理是GL_RGBA,所以它具有为每个纹理元素不同的alpha值。

如果要更改用于渲染的阿尔法值,我能想到以下方法:

  • 改变纹理α值(不知道你说你不想做, )。使用glColor4f更改顶点的alpha值。它会乘以纹理值。您可能需要使用glEnable(GL_COLOR_MATERIAL)和/或glColorMaterial()
  • 使用顶点着色器来更改顶点alpha值。它会乘以纹理值。
  • 使用片段着色器即时更改采样的纹理值。
  • 使用两个纹理阶段并将它们相乘。第二个将具有修改后的alpha值(请参阅glActiveTexture()和朋友)。
  • 使用片段着色器和两个(或更多)纹理阶段。这是最酷的!
+0

我想要的是从每个像素减少一半的alpha,我应该选择哪种解决方案? – jondinham

+1

只要启用了颜色,只要glColor4f(1,1,1,0.5f)应该这样做。 – rodrigo

+0

我需要启用GL_BLEND,并且在生成纹理时我必须使用GL_MODULATE? – jondinham

3

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

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

其次,你将需要设置的openGL以准备混合。这涉及与GL_BLENDglBlendFunc呼叫的glEnable呼叫。大多数情况下,您会希望函数调用为glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA),因为大多数其他的令牌组合会为您提供以后没有的效果(有关更多信息,请参阅glBlendFunc规范页面)。

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