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

标签 opengl textures

我正在加载一个仅由 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/

相关文章:

python - 如何在 pyglet/pyopengl 中使用透明层而不是纯色来清除屏幕

C - GLFW 窗口不会在 Debian 上打开

opengl - 使用 SSBO 作为下一次绘制调用的 VBO 输入

ios - 将纹理设置为彩色 CC3MeshNode

opengl - TEXTURE_2D_ARRAY 未渲染

opengl - 对 glutSolidSphere 进行纹理化

c++ - 是否可以使用带有立方贴图颜色附件的深度渲染缓冲区?

bash - Golang OpenGL 错误 PlatformError : X11: The DISPLAY environment variable is missing panic: NotInitialized: The GLFW library is not initialized

c - 通过定义向结构体添加元素

java - 使用 OpenGL 更改 Java 中纹理中的某些颜色