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

Jak*_*old 5 opengl textures

我正在加载一个仅包含alpha通道的纹理.发送数据时,我需要GL_RED在调用时同时使用图像格式和内部格式glTexImage2D,如下所示

glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, 512, 512, 0, GL_RED, GL_UNSIGNED_BYTE, temp_bitmap);
Run Code Online (Sandbox Code Playgroud)

如果我使用GL_ALPHA其中任何一个/两个,则不会渲染任何内容(适当地更改着色器以使用alpha通道).

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

Nic*_*las 7

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

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

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

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

GLint swizzleMask[] = {GL_ZERO, GL_ZERO, GL_ZERO, GL_RED};
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
Run Code Online (Sandbox Code Playgroud)

为什么还有GL_ALPHA

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

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