OpenGL:类似 Luminance + Alpha 的 16 位内部格式是否可能?

OpenGL: are 16bit internal formats resembling Luminence + Alpha possible?

我有一个发光 alpha 纹理,其中每个像素有两个字节,第一个字节是发光,第二个字节是 alpha。

是否可以将其上传到 GPU,这样(在片段着色器中)alpha 分量将始终引用 alpha,而不管使用的纹理如何,而不会为绿色和蓝色通道浪费纹理内存?

// fragment shader 
vec4 px = texture(tex, uv);
px.r; // is luminescence
px.a; // is alpha (note that .a is used, not .g which would be green for 32bit RGBA textures)

我想避免使用 GL_RG 作为内部格式的原因是因为这需要我在着色器中为 32 位 RGBA 纹理使用单独的代码路径,并且我想避免设置制服 /不同纹理类型的条件。

(如果通用 GPU 能够消除 G 和 B 通道的内存开销,如果它们是 empty/redundant 用于 RGBA 内部格式,那也可以)

The reason I want to avoid using GL_RG as the internal format, is because this would require I use a separate codepath within the shader for 32bit RGBA textures

内部格式定义存储在纹理中的组件。但是,您可以使用 swizzle mask for the texture 调整您获取的内容。要使用 RG 模拟 luminance/alpha,您可以这样做:

GLint swizzleMask[] = {GL_RED, GL_RED, GL_RED, GL_GREEN};
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);