为什么在加载单字节alpha值纹理时需要将图像格式指定为GL_RED而不是GL_ALPHA?

时间:2016-05-04 12:16:13

标签: opengl textures

我正在加载一个仅包含alpha通道的纹理。发送数据时,我需要在调用GL_RED时将glTexImage2D用于图像格式和内部格式,例如以下

glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, 512, 512, 0, GL_RED, GL_UNSIGNED_BYTE, temp_bitmap);

如果我将GL_ALPHA用于其中之一/两者,则不会渲染任何内容(也适当地更改着色器以使用Alpha通道)。

我被告知GL_RED应该用于alpha通道,但为什么会这样,为什么还有GL_ALPHA

1 个答案:

答案 0 :(得分:7)

  

我正在加载一个仅包含alpha通道的纹理。

不,你不是。您正在加载由一个颜色通道组成的纹理。

"阿尔法"仅仅是对数据的解释。您可以自由地解释数据。但是对于OpenGL,"一个颜色通道"是拼写"红色"。两个颜色通道拼写为"红色/绿色"。等等。

如果你想让一个通道着色器看起来像只有你的着色器的alpha-only,那么你应该使用texture swizzle

GLint swizzleMask[] = {GL_ZERO, GL_ZERO, GL_ZERO, GL_RED};
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
  

为什么还有GL_ALPHA

你问为什么调查员存在?如果是这样,那么您可能无法理解纹理的 internal format (第三个参数)与 pixel transfer format 之间的分离(第三个 - 到最后一个参数)。前者定义纹理中存在哪些数据。 GL_RED表示纹理将具有一个颜色通道,其中包含不确定大小的无符号标准化值(停止使用未经过大小处理的图像格式)。

后者定义了如何将应用程序中的数据读入图像。仅将数据上传到图像的特定颜色通道是合法的(尽管没有人会称它为快)。例如,如果您有4通道图像,则可以使用GL_GREEN传输格式将数据上传到其中的绿色通道。