OpenGL:是否可能具有16位内部格式,类似于亮度 alpha

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

本文关键字:格式 内部 类似于 alpha 亮度 16位 是否 OpenGL      更新时间:2023-10-16

i具有一个发光α纹理,每个像素具有两个字节,第一个字节是发光,第二个字节是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通道的内存开销,如果它们为RGBA内部格式为空/冗余,那也可以)

我要避免将GL_RG用作内部格式的原因,是因为这需要我在着色器中使用单独的编码器,用于32位RGBA纹理

内部格式定义存储在纹理中的组件。但是,您可以通过使用swizzle面膜进行纹理来调整您的获取。要模仿带有RG的亮度/alpha,您会这样做:

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