OpenGL:16bit内部格式可能类似于Luminence + Alpha吗?

时间:2017-09-17 22:06:04

标签: c++ opengl fragment-shader

我有一个发光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通道的内存开销,如果它们是RGBA内部格式的空/冗余,那也没关系)

1 个答案:

答案 0 :(得分:5)

  

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

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

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