Ann*_*inn 1 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)
Run Code Online (Sandbox Code Playgroud)
我想避免使用GL_RG作为内部格式的原因是因为这需要我在着色器中使用32位RGBA纹理的单独代码路径,并且我想避免为不同的纹理类型设置制服/条件.
(如果普通的GPU能够消除G和B通道的内存开销,如果它们是RGBA内部格式的空/冗余,那也没关系)
我想避免使用GL_RG作为内部格式的原因是因为这需要在着色器中为32位RGBA纹理使用单独的代码路径
内部格式定义存储在纹理中的组件.然而,你可以通过使用纹理的混合蒙版来调整你所获取的内容.要使用RG模拟亮度/ alpha,您可以这样做:
GLint swizzleMask[] = {GL_RED, GL_RED, GL_RED, GL_GREEN};
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
Run Code Online (Sandbox Code Playgroud)