我正在加载一个仅包含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
?
答案 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
传输格式将数据上传到其中的绿色通道。