如果你有一个带有 1 个颜色通道的源纹理,那么你可以使用以下格式GL_RED
和基本内部格式GL_RED
:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, image_width, image_height,
0, GL_RED, GL_UNSIGNED_BYTE, image_data);
设置纹理参数GL_TEXTURE_SWIZZLE_G
and GL_TEXTURE_SWIZZLE_B
(see glTexParameteri https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexParameter.xhtml)也从红色通道读取绿色和蓝色:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_RED);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_RED);
注意,可能GL_UNPACK_ALIGNMENT https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glPixelStore.xhtml当图像加载到纹理对象时,必须设置为 1:
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, ...);
默认情况下,该参数为 4。这意味着图像的每一行均假定对齐为 4 倍数的大小。如果图像数据紧密排列,则必须更改对齐方式。
如果您使用着色器程序,那么可以通过以下方式实现相同的效果搅拌 https://www.khronos.org/opengl/wiki/Data_Type_(GLSL)#Swizzling. e.g.:
vec3 color = texture(u_texture, uv).rrr;