我正在加载一个仅由 alpha channel 组成的纹理。发送数据时,我需要使用GL_RED
调用时的图像格式和内部格式glTexImage2D
,例如以下
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, 512, 512, 0, GL_RED, GL_UNSIGNED_BYTE, temp_bitmap);
如果我使用
GL_ALPHA
对于其中的任何一个/两个,都不会渲染任何内容(适本地更改着色器以使用 alpha channel )。有人告诉我
GL_RED
应该用于 alpha channel ,但为什么会这样,为什么仍然存在 GL_ALPHA
?
最佳答案
I'm loading a texture that consists just of the alpha channel.
不你不是。您正在加载由一个颜色 channel 组成的纹理。
“Alpha”只是对您数据的一种解释。您可以随意解释数据。但是对于 OpenGL,“一个颜色 channel ”拼写为“红色”。两个颜色 channel 拼写为“红色/绿色”。等等。
如果你想让一个单 channel 着色器看起来像你的着色器只有 alpha,那么你应该使用 texture swizzle :
GLint swizzleMask[] = {GL_ZERO, GL_ZERO, GL_ZERO, GL_RED};
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
why is there still
GL_ALPHA
?
你问为什么枚举器存在?如果是这样,那么你可能不理解internal format之间的分离纹理(第三个参数)和 pixel transfer format (倒数第三个参数)。前者定义了纹理中存在哪些数据。
GL_RED
意味着纹理将有一个颜色 channel ,带有不确定大小的无符号标准化值(停止使用未调整大小的图像格式)。后者定义了如何将应用程序中的数据读入图像。仅将数据上传到图像的特定颜色 channel 是合法的(尽管没有人会称之为快速)。例如,如果您有一个 4 channel 图像,您可以使用
GL_GREEN
将数据上传到其中的绿色 channel 。传输格式。
关于opengl - 为什么在加载单字节 alpha 值纹理时需要将图像格式指定为 GL_RED 而不是 GL_ALPHA?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37027551/